1. 程式人生 > >兩個有序連結串列的合併

兩個有序連結串列的合併


二、實驗分析

(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都沒有賦值,就被我直接用上了,所以造成了段錯誤!

下面是修改後的程式碼段: