天天看點

LeeCode22:合并兩個有序連結清單題目來源題目描述解題思路圖解實作代碼

文章目錄

  • 題目來源
  • 題目描述
  • 解題思路
  • 圖解
  • 實作代碼

題目來源

https://leetcode-cn.com/problems/merge-two-sorted-lists/description/

題目描述

将兩個有序連結清單合并為一個新的有序連結清單并傳回。新連結清單是通過拼接給定的兩個連結清單的所有節點組成的。

示例:

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

解題思路

  • 首先得有一個新的虛拟節點

    newHead

    用來将這兩個連結清單串起來
  • 如圖這樣兩個有序單連結清單,

    l1.val >= l2.val

    ,遵守穩定性,将

    l1

    串到

    newHead

    所在的新連結清單後面,然後

    l1

    後移一位
  • 如果

    l2

    的值大于

    l1

    的值,就将

    l2

    串到

    newHead

    所在的新連結清單,然後

    l2

    後移一位
  • 如果

    l1

    為空,就直接把

    l2

    串到

    newHead

    所在的新連結清單後面
  • 如果

    l2

    為空,就直接把

    l1

    串到

    newHead

    所在的新連結清單後面
  • 最後傳回

    newHead.next

    節點,即新的頭節點

圖解

LeeCode22:合并兩個有序連結清單題目來源題目描述解題思路圖解實作代碼

實作代碼

public class ListNode {
        int val;
        ListNode next;
        ListNode(int x) { val = x; }
    }

    /**
     * newHead
     * @param l1 List1's head
     * @param l2 List2's head
     * @return  newList's newHead
     */
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        //define a virtual head mark head
        ListNode newHead = new ListNode(-1);
        ListNode cur = newHead;
        while (l1 != null && l2 !=null) {
            if (l1.val <= l2.val) {
                cur.next = l1;
                l1 = l1.next;
                cur = cur.next;
            } else {
                cur.next = l2;
                l2 =l2.next;
                cur =cur.next;
            }
        }
        if (l1 == null) {
            cur.next = l2;
        }
        if (l2 == null) {
            cur.next = l1;
        }
        return newHead.next;
    }