PAT—两个有序序列的合并
题目
思路
首先是应该注意审题,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;
}