两个有序链表的合并


二、实验分析

(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都没有赋值,就被我直接用上了,所以造成了段错误!

下面是修改后的代码段:


展开阅读全文

没有更多推荐了,返回首页