1. 程式人生 > >【LeetCode】21. Merge Two Sorted Lists 合併兩個排序的連結串列

【LeetCode】21. Merge Two Sorted Lists 合併兩個排序的連結串列

Difficulty: Easy

 More:【目錄】LeetCode Java實現

Description

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.

Example:

Input: 1->2->4, 1->3->4
Output: 1->1->2->3->4->4

Intuition

合併兩個排序的連結串列題目完全相同,可以採用迴圈和遞迴來實現。迴圈的實現程式碼中可以使用一個dummyHead(虛假頭結點),這個結點可以簡化程式碼(不用先算出頭結點了,而且一開始不需要判斷List1和List2為null了)。

(有了dummy之後,所有的節點都變成擁有前置節點的節點了。所以就不用擔心處理頭節點這個特殊情況了。而且你最後需要返回的僅僅是dummy.next,不用花功夫去保持住你的頭結點了)

(We insert a dummy head before the new list so we don’t have to deal with special cases such as initializing the new list’s head. Then the new list’s head could just easily be returned as dummy head’s next node.)

Solution

    //1. 迴圈
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        //有了dummyHead,就不需要下面兩句了,而且也不用在l1和l2中找出頭結點,
        //頭結點直接用dummyHead.next表示。
        //if(l1==null)    return l2;
        //if(l2==null)    return l1;
        ListNode dummyHead=new ListNode(0);
        ListNode p=dummyHead;
        while(l1!=null && l2!=null){
            if(l1.val<l2.val){
                p.next=l1;
                l1=l1.next;
            }else{
                p.next=l2;
                l2=l2.next;
            }
            p=p.next;
        }
        p.next= l1==null? l2:l1;
        return dummyHead.next;
    }
    
    //2. 遞迴
    public ListNode mergeTwoLists2(ListNode l1, ListNode l2) {
        if(l1==null)    return l2;
        if(l2==null)    return l1;
        if(l1.val<l2.val){
            l1.next=mergeTwoLists(l1.next,l2);
            return l1;
        }else{
            l2.next=mergeTwoLists(l1,l2.next);
            return l2;
        }
    }

  

What I've learned

1. 學會使用dummyHead,注意dummyHead必須初始化,不能為null。

 

 More:【目錄】LeetCode Java實現