题目:本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。
函数接口定义:
其中List
结构定义如下:
L1
和L2
是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge
要将L1
和L2
合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的带头结点的链表头指针。
裁判测试程序样例:
输入样例:
输出样例:
由题意可知我们要用两个链表合成一个新链表,而题中说:应直接使用原序列中的结点,返回归并后的带头结点的链表头指针,说明两个链表的链节要“给出”,给出后自身将的“给出”链节将不存在,所以L1,L2最后应该都是NULL,依照这个思路,我们可以给新链表开辟新空间,不能在原来的链表上作修改,明白这个问题后,就可以依照正常的链结合并去做了。
题解代码:
List Merge(List L1, List L2)
{
//定义两个节点分别指向L1和L2
List pa = L1->Next;
List pb = L2->Next;
//创建新的返回的链表
List L = (List)malloc(sizeof(struct Node));
L->Next = NULL;
List k = L;//尾结点
List newnode;//新节点
//当两个链表都是非空的去执行
while (pa && pb) {
//新的节点的创建
newnode = (List)malloc(sizeof(struct Node));
//赋值
newnode->Next = NULL;
//比较大小
if (pa->Data <= pb->Data) {
//值都赋值给newnode
newnode->Data = pa->Data;
pa = pa->Next;
//添加到尾部
k->Next = newnode;
//更新尾部指针变化
k = k->Next;
}
//同样的道理
else if (pa->Data > pb->Data) {
newnode->Data = pb->Data;
pb = pb->Next;
k->Next = newnode;
k = k->Next;
}
}
//当有的链表没有走完,直接进行连接
if (pa != NULL)
k->Next = pa;
if (pb != NULL)
k->Next = pb;
//因为直接连接的关系,L1或L2没办法直接走到头,故将L1和L2置为NULL
L1->Next = NULL;
L2->Next = NULL;
return (L);
}
以上就是本题的答案,有帮助的话就请帮忙点个赞吧(拜托了,这对我真的很重要/(ㄒoㄒ)/~~)。