[LeetCode] #21 合併兩個有序連結串列
阿新 • • 發佈:2021-07-20
[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; } }
知識點:無
總結:遞迴可以把規模大的、較難解決的問題變成規模較小的、易解決的同一問題。規模較小的問題又變成規模更小的問題,並且小到一定程度可以直接得出它的解,從而得到原來問題的解。