合並兩個排序的鏈表遞歸和非遞歸C++實現


題目描述:

輸入兩個單調遞增的鏈表,輸出兩個鏈表合成后的鏈表,要求合成后的鏈表滿足單調不減規則。

1、分析

已知輸入的兩個鏈表遞增有序,要使輸出的鏈表依然遞增有序,可以依次從輸入的兩個鏈表中挑選最小的元素插入到輸出的鏈表尾部,便可實現輸出鏈表遞增有序。 

2、數據結構定義

struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

3、遞歸實現

/*遞歸實現合並兩個排序鏈表*/
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
    if(pHead1 == NULL)
        return pHead2;
    if(pHead2 == NULL)
        return pHead1;
    if(pHead1->val < pHead2->val)
    {
        pHead1->next = Merge(pHead1->next, pHead2);
        return pHead1;
    }
    else
    {
        pHead2->next = Merge(pHead1, pHead2->next);
        return pHead2;
    }
}

4、非遞歸實現:

/*非遞歸實現合並兩個排序鏈表*/
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
    ListNode *pHead = new ListNode(0);
    ListNode *p = pHead;
    while(pHead1 != NULL && pHead2 != NULL)
    {
        if(pHead1->val < pHead2->val)
        {
            p->next = pHead1;
            pHead1 = pHead1->next;
        }
        else
        {
            p->next = pHead2;
            pHead2 = pHead2->next;
        }
        p = p->next;
    }
    if(pHead1 != NULL)
    {
        p->next = pHead1;
    }
    if(pHead2 != NULL)
    {
        p->next = pHead2;
    }
    return pHead->next;
}

5、總結

這道題使對單鏈表操作比較經典的題目,無論是考研還是面試出現的概率都非常高。題目的思路較為簡單,編碼實現稍微難點,難度雖不大,但能考察編碼基礎功力和對單鏈表的深一層的理解,所以須熟練掌握。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM