1. 程式人生 > >LeetCode 21 Merge Two Sorted Lists(合併兩個已排序的連結串列)(Linked List)

LeetCode 21 Merge Two Sorted Lists(合併兩個已排序的連結串列)(Linked List)

翻譯

合併兩個排好序的連結串列,並返回這個新連結串列。
新連結串列應該由這兩個連結串列的頭部拼接而成。

原文

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;
        }
    }
}