# 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)