Day_15 —— :合併兩個有序鏈表
解法一:新建一個鏈表,然後比較兩個鏈表中的元素值,把較小的那個鏈到新鏈表中,由於兩個輸入鏈表的長度可能不同,所以最終會有一個鏈表先完成插入所有元素,則直接另一個未完成的鏈表直接鏈入新鏈表的末尾。
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *dummy = new ListNode(-1), *cur = dummy;
while (l1 && l2) {
if (l1->val < l2->val) {
cur->next = l1;
l1 = l1->next;
} else {
cur->next = l2;
l2 = l2->next;
}
cur = cur->next;
}
cur->next = l1 ? l1 : l2;
return dummy->next;
}
};
解法二:遞歸。當某個鏈表爲空了,就返回另一個。然後核心還是比較當前兩個節點值大小,如果 l1 的小,那麼對於 l1 的下一個節點和 l2 調用遞歸函數,將返回值賦值給 l1.next,然後返回 l1;否則就對於 l2 的下一個節點和 l1 調用遞歸函數,將返回值賦值給 l2.next,然後返回 l2。
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l1) return l2;
if (!l2) return l1;
if (l1->val < l2->val) {
l1->next = mergeTwoLists(l1->next, l2);
return l1;
} else {
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
};
解法三:還是遞歸的寫法,只是去掉了 if 從句,看起來更加簡潔一些,但是思路並沒有什麼不同:
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l1) return l2;
if (!l2) return l1;
ListNode *head = l1->val < l2->val ? l1 : l2;
ListNode *nonhead = l1->val < l2->val ? l2 : l1;
head->next = mergeTwoLists(head->next, nonhead);
return head;
}
};
解法四:參考大佬的三行搞定,太牛逼了。
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l1 || (l2 && l1->val > l2->val)) swap(l1, l2);
if (l1) l1->next = mergeTwoLists(l1->next, l2);
return l1;
}
};