一刷劍指offer(17)——合併兩個排序的鏈表

題目:
輸入兩個遞增排序的鏈表,合併這兩個鏈表並使新鏈表中的結點仍然是按照遞增排序的。鏈表結點定義如下:
struct ListNode
{
    int m_nValue;
    ListNode* m_pNext;
};

需要注意兩個問題:

1、清楚合併的過程,避免鏈表中間斷開或者未實現遞增排序;

2、特別處理特殊輸入。

不斷比較兩個鏈表的頭結點,將較小的頭結點鏈接到已經合併的鏈表。(典型遞歸)

爲了解決魯棒性的問題,對空鏈表單獨處理,分爲3種情況:

1、當鏈表1爲空,即它的頭結點爲空指針,合併結果爲鏈表2;

2、當鏈表2爲空,合併結果爲鏈表1;

3、當兩個鏈表皆空,合併結果爲空

ListNode* Merge(ListNode* pHead1,ListNode* pHead2)
{
    if(pHead1==NULL)
        return pHead2;
    else if(pHead2==NULL)
        return pHead1;
    ListNode* pMergedHead=NULL;
    if(pHead1->m_nValue<pHead2->m_nValue)
    {
        pMergedHead=pHead1;
        pMergedHead->m_pNext=Merge(pHead1->m_pNext,pHead2);
    }
    else
    {
        pMergedHead=pHead2;
        pMergedHead->m_pNext=Merge(pHead1,pHead2->m_pNext);    
    }
    return pMergedHead;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章