# 【LeetCode】 21. Merge Two Sorted Lists ## Description > Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. > 請合併兩個已經排序過的linked lists並回傳新的list。 > 新的list應該要由前面兩個list所有的節點構成。 ## Example: ``` Example: Input: 1->2->4, 1->3->4 Output: 1->1->2->3->4->4 ``` ## Solution * 設`temp`去遍歷`l1`每個節點,如果`temp`的值大於(等於)`l2`的值,就把`l2`的節點插入至`temp`之前,並把`l2`往下一個節點走。 * `l2`沒東西就結束。 * 我一開始的做法是像一般做merge sort的最後一步一樣,兩者比較,小的就放進新的List裡面。但不知道為什麼速度慢很多,也許是一些判斷沒做好。Code一樣放在下面,僅供參考。 ### Code ```C++=1 // Definition for singly-linked list. // struct ListNode { // int val; // ListNode *next; // ListNode(int x) : val(x), next(NULL) {} // }; class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode* temp = l1; ListNode* last = NULL; if (l1 == NULL) return l2; while (l2 != NULL) { if (temp == NULL) { last->next = l2; break; } else if (temp->val >= l2->val) { if (last == NULL) { last = new ListNode(l2->val); l1 = last; last->next = temp; } else { last->next = new ListNode(l2->val); last = last->next; last->next = temp; } l2 = l2->next; } else { last = temp; temp = temp->next; } } return l1; } }; ``` * 比較慢的版本 ```C++=1 // Definition for singly-linked list. // struct ListNode { // int val; // ListNode *next; // ListNode(int x) : val(x), next(NULL) {} // }; class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode *last = NULL; ListNode *ans = NULL; while(l1!=NULL||l2!=NULL) { ListNode *temp; if(l1==NULL) { temp = l2; l2 = l2->next; } else if(l2 == NULL || l1->val < l2->val) { temp = l1; l1 = l1->next; } else { temp = l2; l2 = l2->next; } if(ans==NULL) { ans = temp; last = temp; } else { last->next = temp; last = last->next; } } return ans; } }; ``` ###### tags: `LeetCode` `C++`