連結串列面試題(七)---合併兩個有序連結串列

gogogo_sky發表於2017-05-17

一、結構體的定義

typedef int DataType;

typedef struct ListNode//定義結點
{
    DataType data;
    struct ListNode* next;
}ListNode,*PListNode;

typedef struct  PList//定義一個成員是指向結點的指標的結構體
{
    PListNode PHead;
}PList,*PList;

二、函式實現
(1)合併兩個有序連結串列(非遞迴)

//7.合併兩個有序連結串列(非遞迴)
PListNode  ConnectList(PList PList1,PList PList2)
{
    PListNode cur1=NULL;//用於遍歷連結串列PList1
    PListNode cur2=NULL;//用於遍歷連結串列PList2
    PListNode NewHead=NULL;//指向新連結串列的第一個結點的指標(一旦確定就不動)
    PListNode tail=NULL;//新連結串列的尾指標(每次連線一個新結點,更新一次)
    assert(PList1&&PList2);
    cur1=PList1->PHead;
    cur2=PList2->PHead;
    //1.如果兩個連結串列相等(即就是說合並一個連結串列),包括兩個連結串列都是空,返回任意一個
    if (PList1->PHead==PList2->PHead)
    {
        return PList1->PHead;
    }
    //2.如果兩個連結串列不相等,且一個為空,返回不為空的連結串列的頭指標;
    if (PList1->PHead==NULL)
    {
        return  PList2->PHead;
    }
    if (PList2->PHead==NULL)
    {
        return PList1->PHead;
    }
    //3.確定新連結串列的頭結點

    //如果連結串列1的頭結點的值小於連結串列2,新連結串列的頭指向連結串列1的第一個結點,尾結點也是第一個結點
    //然後更新當前結點;
    if (cur1->data<cur2->data)
    {
        NewHead=cur1;
        tail=cur1;
        cur1=cur1->next;
    }
    else
    {
        NewHead=cur2;
        tail=cur2;
        cur2=cur2->next;
    }

    //4.開始比較並且連線
    while (cur1&&cur2)//當兩個連結串列同時沒有走完時,進去連線
    {
        if (cur1->data<cur2->data)
        {

            tail->next=cur1;//給心連結串列尾部連線結點
            tail=tail->next;//更新新連結串列的尾部
            cur1=cur1->next;//更新當前結點的為下一個結點
        }
        else
        {
            tail->next=cur2;
            tail=tail->next;
            cur2=cur2->next;
        } 
    }
    //5.等到有一個連線完畢,迴圈出來

    //當一個連結串列全部元素連線完畢,那麼將另一個連結串列剩下的元素的頭連線到新元素的尾
    if (cur1==NULL)
        tail->next=cur2;
    else
        tail->next=cur1;
    return NewHead;
}

(2)合併兩個連結串列(遞迴)

//7.1合併兩個連結串列(遞迴)
PListNode ConnectList1(PListNode PHead1,PListNode PHead2)
{
    PListNode cur1=NULL;
    PListNode cur2=NULL;
    PListNode NewNode=NULL;
    cur1=PHead1;
    cur2=PHead2;

    //1.特殊情況處理
    if (PHead1==PHead2)//兩個要合併的連結串列相同(包括兩個連結串列都為空),任意返回一個
    {
        return PHead1;
    }
    //只有一個連結串列空,返回指向不為空的連結串列的第一個結點的指標
    if (PHead1==NULL)
    {
        return PHead2;
    }
    if (PHead2==NULL)
    {
        return PHead1;
    }

    //2.確定新連結串列的

    if (cur1->data < cur2->data)
    {
        NewNode=cur1;
        cur1=cur1->next;
        NewNode->next=ConnectList1(cur1,cur2);
    }
    else
    {
        NewNode = cur2;
        cur2=cur2->next;
        NewNode->next=ConnectList1(cur1,cur2);
    }

    return NewNode;
}

相關文章