【oj刷题记】【考研写法注意点】【1294】【多项式加法】【利用归并思想】【考研写法关于另外一个可能导致指针越界的问题】【以及遍历链表最保险的写法】

 一.注意点**

 

一.本题的题解

/*
系数: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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值