題目:
輸入兩個遞增排序的鏈表,合併這兩個鏈表並使新鏈表中的結點仍然是按照遞增排序的。鏈表結點定義如下:
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;
}