---
# System prepended metadata

title: 21. Merge Two Sorted Lists

---

# 21. Merge Two Sorted Lists

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

## 題目概要

給定兩個鏈結串列 list1, list2，合併兩個鏈結串列並且由小到大排序。

![](https://i.imgur.com/NCeEvAo.png)


## 解題技巧

- 解題技巧我用備註寫上了，看備註應該很好懂。

## 程式碼

```javascript=
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} list1
 * @param {ListNode} list2
 * @return {ListNode}
 */
var mergeTwoLists = function (list1, list2) {
  /* cur 用於遍歷, dummy 用於占住頭節點, 
   * 當鏈結串列生成完後, 只需要 return dummy.next 就可以返回整個鏈結串列結果
   */
  let cur = new ListNode();
  let dummy = cur;

  /*
   * 1. 如果兩個鏈結串列中都還有值，那就互相比較哪個值小，將 cur.next 指向該節點，並且將 cur 往後移。
   * 2. 若其中一個鏈結串列的 next 指向空的節點時，代表另外一個鏈結串列剩餘的數已然大於該鏈結串列，所以直接放到當前結果後方即可。
   */

  // 1. 兩個鏈結串列都還有值的情況
  if (list1 !== null && list2 !== null) {
    if (list1.val < list2.val) {
      cur.next = list1; // 等價於 cur.push(list1);
      list1 = list1.next; // 等價於 i++
    } else {
      cur.next = list2;
      list2 = list2.next;
    }
    // 以上操作只將 cur.next 指向節點，但卻沒有讓 cur 往下走，所以需要將 cur 往後一位
    cur = cur.next;
  }

  // 2. 其中一個鏈結串列已經沒有值，直接將鏈結串列剩餘的值放到最後。
  if (list1 !== null) {
    /* 假設當前 list1 = null, list2 = 2 -> 3 -> 4, 我們只需將 cur.next 指向 list2, 
     * 除了下一個值 2 會被放過來之外, 本來的 2 -> 3 -> 4 指向關係也會一起被放進來, 所以只需要做一次就可以
     */
    cur.next = list1;
  } else if (list2 !== null) {
    cur.next = list2;
  }

  /*
   * 為什麼是返回 dummy.next 卻不是返回 dummy?
   * 因為 cur 一開始指向的是一個空節點, 所以 dummy.next 開始才是我們需要的結果
   */
  return dummy.next;
};
```

![](https://i.imgur.com/OJCBcZs.png)
