觀前提醒:
- 我預設大家已經先思考並分析過題目,沒啥想法才開始 google 找解題靈感。若無,建議每題先花 1~2 顆番茄鐘的時間來分析題目比較好。可參考番茄鐘工作法。
- 承上,既然已經有思考過了,那我這邊直接 po 題目 + 解題想法 + code +心得 。若已經在 code 內有足夠的註解了,那我可能解題想法 & 心得的部分就不會寫太多,免得干擾你的思考。
- 所有解法都是已經取得系統的 Accepted,但或許不是最優解法,請多包涵。
- 最後,歡迎在下面留言指教~教學相長才會進步歐~

Merge two sorted linked lists and return it as a new sorted 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
要解這題,就需要先對維基百科裡面常見的資料結構,鼎鼎大名的 Linked List,來好好地了解一番~
若大家英文版看得霧煞煞,也可以參考這篇由 Chiu CC 大大所寫的 Linked List 中文版教學文,以下節錄部分文章:
Linked list(連結串列)是一種常見的資料結構,其使用node(節點)來記錄、表示、儲存資料(data),並利用每個node中的pointer指向下一個node,藉此將多個node串連起來,形成Linked list,並以NULL來代表Linked list的終點,見圖一(a)。
若實際打開每個node的內部,至少會包含(1)data來代表資料,與(2)pointer指向下一個node,見圖一(b):
好的,那在看完簡單的教學後,我們知道 Linked List 中任一個 node 一定包含以下重要兩大資訊:
data -- 代表資料
pointer -- 指向下一個 node
那接下來,我們需要搞定的問題就是,要把兩串 Sorted Linked List ,按各數字大小,重新組合成一串全新的Linked List。我們可以採取以下策略:
那我們就馬上實作看看囉~
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var mergeTwoLists = function (l1, l2) {
  // 創立一個全新的 ListNode ,來當作主鏈表。
  let headNode = new ListNode(0);
  let currentNode = headNode;
  // 讀取 l1 目前的值與 l2目前的值比較。
  // 如果 l1.val 小於 l2.val,將當前的 l1 節點加入主鏈表,然後把 l1 指向下一個 l1 節點。
  // 如果 l1.val 大於 l2.val,則把 l2 當前的節點加入主鏈表,然後把 l2 指向下一個 l2 節點。
  while (l1 !== null && l2 !== null) {
    if (l1.val < l2.val) {
      currentNode.next = l1;
      l1 = l1.next;
    } else {
      currentNode.next = l2;
      l2 = l2.next;
    }
    currentNode = currentNode.next;
  }
  // 直到 l1 或 l2 一方為 null 則停止比較,並且將另外一邊剩下的節點加入result。
  if (l1 === null) {
    currentNode.next = l2;
  } else if (l2 === null) {
    currentNode.next = l1;
  }
  return headNode.next;
};
 。
。謝謝大家的收看,LeetCode 小學堂我們下次見~