21. Merge Two Sorted Lists

25 年 11 月 10 日 星期一
290 字
2 分钟

21. Merge Two Sorted Lists

Screenshot 2025-11-10 at 2.20.24 am

方法一:递归

js
/**
 * 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) {
  if (list1 === null) {
    return list2
  } else if (list2 === null) {
    return list1
  } else if (list1.val < list2.val) {
    list1.next = mergeTwoLists(list1.next, list2)
    return list1
  } else {
    list2.next = mergeTwoLists(list1, list2.next)
    return list2
  }
}

方法二:迭代

为什么需要prev指针:

prev相当于合成后链表的最新节点,而i,j相当于待合成节点

js
/**
 * 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) {
  const prehead = new ListNode(null)
  let prev = prehead
  let i = list1,
    j = list2
  while (i !== null && j !== null) {
    if (i.val < j.val) {
      prev.next = i
      i = i.next
    } else {
      prev.next = j
      j = j.next
    }
    prev = prev.next
  }
  // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
  prev.next = i === null ? j : i

  return prehead.next
}

https://leetcode.cn/problems/merge-two-sorted-lists/solutions/226408/he-bing-liang-ge-you-xu-lian-biao-by-leetcode-solu

文章标题:21. Merge Two Sorted Lists

文章作者:Sirui Chen

文章链接:https://blog.siruichen.me/posts/21_merge_two_sorted_lists[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。