一.注意点**
一.本题的题解
/*
系数:coefficient
指数: exponent
*/
#include <bits/stdc++.h>
using namespace std;
int n,m;
struct Node
{
int expn; //指数
int coef; //系数
Node *next;
Node(){}
Node(int key1,int key2):expn(key1),coef(key2),next(NULL){}
};
void init(Node* &la,Node* &lb)
{
cin>>n>>m;
//1.整理第一个多项式
for(int i=1;i<=n;i++)
{
int expn,coef;
cin>>expn>>coef;
Node *now=new Node(expn,coef);
/*
找到【la链表】中第一个大于等于【新输入的节点指数值】的
节点的 【前一个节点】。
(要找的节点的前一个节点)
*/
Node *p=la;
while(p->next&&(p->next->expn)< now->expn)
{
p=p->next;
}
//现在p就是前一个节点,他的后一个节点有两种情况:1.等于now的指数,2.大于now的指数
if(p->next!=NULL&&p->next->expn==now->expn) //指数相同就合并
{
p->next->coef+=now->coef;
}
else //指数不同就插入
{
now->next=p->next;
p->next=now;
}
}
//2.整理第二个多项式
for(int i=1;i<=m;i++)
{
int expn,coef;
cin>>expn>>coef;
Node *now=new Node(expn,coef);
Node *p=lb;
while(p->next&&p->next->expn < now->expn) //找要找节点的前一个节点
{
p=p->next;
}
if(p->next!=NULL&&p->next->expn==now->expn) //指数相同就合并
{
p->next->coef+=now->coef;
}
else //指数不同就插入
{
now->next=p->next;
p->next=now;
}
}
}
void merge(Node *la,Node *lb)
{
Node *pa=la->next;
Node *pb=lb->next;
while(pa&&pb)
{
if(pa->expn==pb->expn) //如果指数相同
{
if(pa->coef+pb->coef!=0)
cout<<pa->expn<<" "<<(pa->coef+pb->coef)<<endl; //装入答案中
pa=pa->next;
pb=pb->next;
}
else if(pa->expn<pb->expn) //如果pa的指数小于pb的指数
{
cout<<pa->expn<<" "<<pa->coef<<endl; //装入答案中
pa=pa->next;
}
else if(pa->expn>pb->expn) //如果pa的指数大于pb的指数
{
cout<<pb->expn<<" "<<pb->coef<<endl; //装入答案中
pb=pb->next;
}
}
//扫尾
while(pa)
{
cout<<pa->expn<<" "<<pa->coef<<endl;
pa=pa->next;
}
while(pb)
{
cout<<pb->expn<<" "<<pb->coef<<endl;
pb=pb->next;
}
}
int main()
{
//la是第一个链表的开头 ,lb是第二个链表的开头
Node *la=new Node(),*lb=new Node();
la->next=NULL;
lb->next=NULL;
init(la,lb); //用两个链表分别整理两个多项式
merge(la,lb); //实现两个多项式相加
return 0;
}