LeetCode 21 Merge Two Sorted Lists(合併兩個已排序的連結串列)(Linked List)
阿新 • • 發佈:2019-01-02
翻譯
合併兩個排好序的連結串列,並返回這個新連結串列。
新連結串列應該由這兩個連結串列的頭部拼接而成。
原文
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.
分析
這裡我們使用遞迴的方法。我們構造一個新的ListNode,就叫做tmp,看著像是一個臨時變數。的確,從區域性來看它是臨時變數,每次都會將l1或者l2賦值給它,但這裡的l1和l2都是動態變化的,最重要的是每次return的tmp都是一個新的連結串列,最後一次返回的也就是我們所合併出來的連結串列。
我這裡構造出來的連結串列順序是由小到大的,因此當l1當前節點的值大於l2當前節點的值時,我們取的是l2這個較小的值,並將l2的下一個節點的值和l1當前節點的值放到下一次做對比,依次遞迴下去。
程式碼
C Plus Plus
/**
* 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) {
if (l1 == NULL) return l2;
if (l2 == NULL) return l1;
if (l1->val > l2->val) {
ListNode *tmp = l2;
tmp->next = mergeTwoLists(l1, l2->next);
return tmp;
} else {
ListNode *tmp = l1;
tmp->next = mergeTwoLists(l1->next, l2);
return tmp;
}
}
};
Java
update at 2016/09/17
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
if (l1.val > l2.val) {
ListNode tmp = l2;
tmp.next = mergeTwoLists(l1, l2.next);
return tmp;
} else {
ListNode tmp = l1;
tmp.next = mergeTwoLists(l1.next, l2);
return tmp;
}
}
}