![](https://i-blog.csdnimg.cn/blog_migrate/7d4273ae9ccd44dd5b0b86f9358c074a.png)
二、实验分析
(1)问题分析
1、考虑两个链表L1,L2中数据的多少;
2、用两个指针同时遍历两个有序链表L1,L2,并且比较每次读取的两个链表元素的数值,将其中的小值插入到新的链表L中。
3、考虑到其中链表L1(或者L2)由于元素少,而被先遍历完,另个链表L2(或者L1)直接接在新的链表L表尾;
4、函数返回新链表L的表头。
(2)实现要点
1、设置指针t1遍历L1,指针t2遍历L2,指针Ptr指向合适的结点(在L1中的结点,或者L2中的结点)来构造新的链表L。
实验代码:
List Merge(List L1,List L2)
{List t1,t2,Ptr,L;
if(L1==NULL&&L2==NULL)
return NULL;
else if(L1==NULL)
return L2;
else if(L2==NULL)
return L1;
t1=L1->Next;
t2=L2->Next;
L=(List)malloc(sizeof(struct Node));
L->Next=NULL;
Ptr=L;
while(t1&&t2)
{
if(t1->Data<=t2->Data)
{
Ptr->Next=t1;
Ptr=t1;
t1=t1->Next;
Ptr->Next=NULL;
}
else
{
Ptr->Next=t2;
Ptr=t2;
t2=t2->Next;
Ptr->Next=NULL;
}
}
while(t1)
{
Ptr->Next=t1;
Ptr=t1;
t1=t1->Next;
Ptr->Next=NULL;
}
while(t2)
{
Ptr->Next=t2;
Ptr=t2;
t2=t2->Next;
Ptr->Next=NULL;
}
L1->Next=NULL;
L2->Next=NULL;
return L;
}
三、实验总结
1.在遍历L1,L2,并取出较小元素(现假设是L1中被访问的某个元素较小)放到新的链表L中;
比较一下两段代码,区别在哪?
代码段1:
这个代码段是错误的;
现在Ptr指向链表L1中的t1所指结点,可我却把整个L1链表置空了,
那接下来t1就不能遍历L1中剩余的其他结点了。
代码段2:
这个代码段是正确的;
在新链表L中用尾插法形成,先将本次比较中,数值较小的结点插入L中,再让t1继续遍历L1,同时再次确定此时Ptr是链表L的尾结点。
2.我犯的一个段错误问题
这里的t1,t2都没有赋值,就被我直接用上了,所以造成了段错误!
下面是修改后的代码段: