1. 程式人生 > 其它 >[LeetCode] #21 合併兩個有序連結串列

[LeetCode] #21 合併兩個有序連結串列

[LeetCode] #21 合併兩個有序連結串列

將兩個升序連結串列合併為一個新的 升序 連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。

輸入:l1 = [1,2,4], l2 = [1,3,4]

輸出:[1,1,2,3,4,4]

直接從左到右比較兩個連結串列的val,誰小就把數字放在合併連結串列中並往後移。迴圈直到其中一個連結串列為空,再把不為空連結串列直接連線在合併連結串列後面。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 
*/ class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode l3 = new ListNode(0); ListNode tmp = l3; while(l1 != null && l2 != null){ if(l1.val < l2.val){ tmp.next = l1; tmp = tmp.next; l1
= l1.next; }else{ tmp.next = l2; tmp = tmp.next; l2 = l2.next; } } if (l1 == null) { tmp.next = l2; } else { tmp.next = l1; } return l3.next; } }

之後逛到一種遞迴的解法,但思路和上面是一樣的。

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) return l2;
        if (l2 == null) return l1;
        ListNode res = l1.val < l2.val ? l1 : l2;
        res.next = mergeTwoLists(res.next, l1.val >= l2.val ? l1 : l2);
        return res;
    }
}

知識點:

總結:遞迴可以把規模大的、較難解決的問題變成規模較小的、易解決的同一問題。規模較小的問題又變成規模更小的問題,並且小到一定程度可以直接得出它的解,從而得到原來問題的解。