LeetCode(21):合並兩個有序鏈表


Easy!

題目描述:

將兩個有序鏈表合並為一個新的有序鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。 

示例:

輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4

解題思路:

具體思想就是新建一個鏈表,然后比較兩個鏈表中的元素值,把較小的那個鏈到新鏈表中,由於兩個輸入鏈表的長度可能不同,所以最終會有一個鏈表先完成插入所有元素,則直接將另一個未完成的鏈表直接鏈入新鏈表的末尾。代碼如下:

C++解法一:

 1 class Solution {
 2 public:
 3     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
 4         ListNode *dummy = new ListNode(-1), *cur = dummy;
 5         while (l1 && l2) {
 6             if (l1->val < l2->val) {
 7                 cur->next = l1;
 8                 l1 = l1->next;
 9             } else {
10                 cur->next = l2;
11                 l2 = l2->next;
12             }
13             cur = cur->next;
14         }
15         cur->next = l1 ? l1 : l2;
16         return dummy->next;
17     }
18 };

下面我們來看遞歸的寫法,當某個鏈表為空了,就返回另一個。然后核心還是比較當前兩個節點值大小,如果l1的小,那么對於l1的下一個節點和l2調用遞歸函數,將返回值賦值給l1.next,然后返回l1;否則就對於l2的下一個節點和l1調用遞歸函數,將返回值賦值給l2.next,然后返回l2,參見代碼如下:

C++解法二:

 1 class Solution {
 2 public:
 3     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
 4         if (!l1) return l2;
 5         if (!l2) return l1;
 6         if (l1->val < l2->val) {
 7             l1->next = mergeTwoLists(l1->next, l2);
 8             return l1;
 9         } else {
10             l2->next = mergeTwoLists(l1, l2->next);
11             return l2;
12         }
13     }
14 };

下面這種遞歸的寫法去掉了if從句,看起來更加簡潔一些,但是思路並沒有什么不同:

C++解法三:

 1 class Solution {
 2 public:
 3     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
 4         if (!l1) return l2;
 5         if (!l2) return l1;
 6         ListNode *head = l1->val < l2->val ? l1 : l2;
 7         ListNode *nonhead = l1->val < l2->val ? l2 : l1;
 8         head->next = mergeTwoLists(head->next, nonhead);
 9         return head;
10     }
11 };

還可以三行搞定,簡直喪心病狂有木有!

C++解法四:

1 class Solution {
2 public:
3     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
4         if (!l1 || (l2 && l1->val > l2->val)) swap(l1, l2);
5         if (l1) l1->next = mergeTwoLists(l1->next, l2);
6         return l1;
7     }
8 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM