題目描述:
輸入兩個單調遞增的鏈表,輸出兩個鏈表合成后的鏈表,要求合成后的鏈表滿足單調不減規則。
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、總結
這道題使對單鏈表操作比較經典的題目,無論是考研還是面試出現的概率都非常高。題目的思路較為簡單,編碼實現稍微難點,難度雖不大,但能考察編碼基礎功力和對單鏈表的深一層的理解,所以須熟練掌握。