LeetCode-合併兩個有序鏈表(遞歸和非遞歸兩種解題方式)

在這裏插入圖片描述

題目:

將兩個升序鏈表合併爲一個新的升序鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。

示例:

輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/merge-two-sorted-lists
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

非遞歸方法(好理解)方法出處

解題思路:

  1. 比較兩個頭節點,保存小的頭結點到head鏈表,以此類推
  2. 若兩個鏈表長度不同,長鏈表剩下的結點存到head鏈表中

Coding~

//非遞歸方式
public ListNode mergeTwoLists2(ListNode l1, ListNode l2) {
    //頭結點的前驅
    ListNode dummy = new ListNode(0);
    ListNode head = dummy;
    //比較兩個頭節點,保存小的頭節點,以此類推
    while (l1 != null && l2 != null) {
        if (l1.val < l2.val) {
            head.next = new ListNode(l1.val);
            l1 = l1.next;
        } else {
            head.next = new ListNode(l2.val);
            l2 = l2.next;
        }
        head = head.next;
    }
    //若兩個鏈表長度不同,長鏈表剩下的結點存到head鏈表中
    if(l1 != null) head.next = l1;
    if(l2 != null) head.next = l2;
    return dummy.next;
}

注:

dummy結點:鏈表的第一個結點,因爲沒有前驅節點,所以該結點需要特殊處理,會導致額外的代碼量。如果創建一個dummy結點,將其作爲第一個結點的前驅結點,這樣鏈表中所有的結點都可以通過同樣的邏輯來處理了。

遞歸方法 借鑑

終止條件:任何一個鏈表空,則遞歸終止
解題思路:選出兩個鏈表中,頭結點val最小的結點,用它的next指向其他結點的集合

Coding~

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    //任何一個鏈表空,則遞歸終止
    if (l1 == null) return l2;
    if (l2 == null) return l1;
    //選出兩個鏈表中,頭結點val最小的結點,用它的next指向其他結點的集合
    if (l1.val < l2.val) {
        l1.next = mergeTwoLists(l1.next, l2);
        return l1;
    } else {
        l2.next = mergeTwoLists(l1, l2.next);
        return l2;
    }
}

最後我們寫下測試方法吧~

public static void main(String[] args) {
    ListNode l1 = new ListNode(1);
    l1.next = new ListNode(2);
    l1.next.next = new ListNode(4);
    ListNode l2 = new ListNode(1);
    l2.next = new ListNode(3);
    l2.next.next = new ListNode(4);

    mergeTwoLists mergeTwoLists = new mergeTwoLists();
    ListNode nonrecursion = mergeTwoLists.mergeTwoLists2(l1, l2);
    System.out.println(nonrecursion);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章