PAT---两个有序序列的合并

这篇博客介绍了如何高效地合并两个已排序的单链表,通过创建新的头结点并比较链表中元素的大小,将较小的元素依次插入到新链表的末尾,最终形成一个有序的链表。文章强调了处理链表头结点的重要性以及避免不必要的内存分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PAT—两个有序序列的合并

题目

wangxining_2021-05-28_12-24-31

wangxining_2021-05-28_12-24-42

思路

首先是应该注意审题,L1,L2都是带头结点的单链表,也就是说L1->Next才是这个链表的数据存储的地方,再一点就是这种链表都是要有头尾的,L一开始在头,最后返回的也就是L,r是移动加入链表的地方;L1,L2也不要去移动,让p和q去移动。L为什么要malloc,因为L的next要赋值,而且还要赋给r所以要给malloc,因为你不malloc,系统申请变量得到的空间就是指针的那个地址的空间,所以不能用Next。而p,q,r呢全都是赋值已经有的空间,所以不需malloc,当然你要是想malloc,也是可以的。这个题目中是需要头结点的返回,所以我们在最后返回L即可,而不需要把L向后移动,并且释放头结点的空间的操作了。

代码

List Merge( List L1, List L2 ){
	List L,p,q,r;
	L=(List)malloc(sizeof(struct Node));	//新建一个结点
	p=L1->Next;	//p指向L1最小值
	q=L2->Next;	//q指向L2最小值
	L->Next=NULL;//要使用Next所以要给L进行malloc空间
	r=L;		//r指向L
	while(p!=NULL&&q!=NULL)	//p、q都不空,选取p、q所指结点较小者插入L的尾部
	{
		if(p->Data<=q->Data){
			r->Next=p;
			p=p->Next;
			r=r->Next;
		}else{
			r->Next=q;
			q=q->Next;
			r=r->Next;
		}
	}
	if(p!=NULL) r->Next=p;
	if(q!=NULL) r->Next=q;
	L1->Next=NULL;
	L2->Next=NULL;
	return L;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值