劍指offer 25. 合併兩個排序的連結串列
阿新 • • 發佈:2018-12-10
1.問題描述
輸入兩個單調遞增的連結串列,輸出兩個連結串列合成後的連結串列,當然我們需要合成後的連結串列滿足單調不減規則。
2.解決思路
1)非遞迴的方法
如果可以改變連結串列,直接從頭結點開始依次移動比較兩個連結串列當前值的大小,把較小的值作為當前結點的下一個結點。
注意:剛剛開始的時候不知道頭結點到底是1的還是2的,所以新建一個額外的新節點作為輔助:
ListNode *first = new ListNode(-1);
返回first->next即為所求。
2)遞迴的方法
每次比較頭結點node1和node2的值,如果把小的作為當前的結點,然後遞迴地比較下一個結點。
3.程式碼實現
1)非遞迴方法
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ //非遞迴解決方法 class Solution { public: ListNode* Merge(ListNode* node1, ListNode* node2) { if (node1 == NULL) return node2; if (node2 == NULL) return node1; ListNode* first = new ListNode(-1); ListNode* tmp = first; while (node1 != NULL && node2 != NULL){ if (node1->val <= node2->val){ tmp->next = node1; node1 = node1->next; } else{ tmp->next = node2; node2 = node2->next; } tmp = tmp->next; } if (node1 == NULL) tmp->next = node2; if (node2 == NULL) tmp->next = node1; return first->next; } };
2)遞迴方法
class Solution { public: ListNode* Merge(ListNode* node1, ListNode* node2) { if(node1 == NULL) return node2; if(node2 == NULL) return node1; ListNode *head; if(node1->val <= node2->val){ head = node1; head->next = Merge(node1->next, node2); } else{ head = node2; head->next = Merge(node1, node2->next); } return head; } };