数据结构 两个递增有序列表合并为一个递增有序列表的解决方法

数据结构

两个递增有序列表合并为一个递增的有序链表(要求:不占用多余存储空间,新链中不允许有重复元素)
求解思路
  • 假设两个需要和合并的链表为La和Lb,合并后的头指针用Lc来代替。设置pa,pb分别为La,Lb的工作指针,pc用来保证新链的完整性。
	Lnode mergelist(LinkList &a,LinkList &b){			//将两个有序链表合并为一个链表
	LinkList *Lc = new Lnode;
	Lnode *pa,*pb,*pc;
	pa = La->next;									//工作指针pa
	pb = Lb->next;
	pc = Lc = La;									//合并后的新链Lc
  • 进入循环当pa与pb其中一个为空时退出循环
 	while (pa&&pb){									//当pa或者pb其中有一个链为空时停止循环
  • pa与pb对比时分为pa<pb;pa>pb;pa=pb三总情况
    • 当pa<pb时,先将pc->next指向pa,再将pa赋值给pc,最后pa向后移动一位,代码如下:
    	if(pa->data<pb->data){						//pa.data小于pb.data时
    		pc->next = pa;							//保证链表的连续
    		pc=pa;									//pc向后走
    		pa=pa->next;							//pa向后走
    	}
    
    • 当pa>pb时,先将pc->next指向pb,再将pb赋值给pc,最后pb向后移动一位,代码如下:
    	else if(pa->data>pb->data){				//pa.data大于pb.data时
    		pc->next = pb;
    		pc=pb;
    		pb=pb->next;
    	}
    
    • 当pa==pb时,我们取pa的值,并将pb的值进行删除
	else {										//pa.data等于pb.data时
		 pc->next=pa;
		 pc=pa;
		 pa=pa->next;
		 q=pb->next;
		 delete pb;
		 pb = q;
	}
	- 注意:delete 删除pb时,删除的是pb指向的内容而不是pb这个指针变量
  • 剩下就是连接未遍历完成的链,再删除Lb头指针即可。
	pc->next = pa?pa:pb;
	delete Lb;
完整代码如下:
	Lnode *mergelist(LinkList &a,LinkList &b){			//将两个有序链表合并为一个链表
	LinkList *Lc = new Lnode;
	Lnode *pa,*pb,*pc;
	pa = La->next;									//工作指针pa
	pb = Lb->next;
	pc = Lc = La;									//合并后的新链Lc
	while (pa&&pb){									//当pa或者pb其中有一个链为空时停止循环
		if(pa->data<pb->data){						//pa.data小于pb.data时
			pc->next = pa;							//保证链表的连续
			pc=pa;									//pc向后走
			pa=pa->next;							//pa向后走
		}
		else if(pa->data>pb->data){				//pa.data大于pb.data时
			pc->next = pb;
			pc=pb;
			pb=pb->next;
		}
		else {										//pa.data等于pb.data时
			 pc->next=pa;
			 pc=pa;
			 pa=pa->next;
			 q=pb->next;
			 delete pb;
			 pb = q;
		}
	}	
	pc->next = pa?pa:pb;
	delete Lb;
	return Lc;
}

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值