# 合并两个有序链表 (opens new window)

  • 难度:Easy
  • 标签:链表 排序

# 刷题思路

  • [x] 迭代推进
  • [x] 递归推进

# 方法 1 迭代推进

  • 思路: 迭代推进,一个链表以上为空时停止,将剩余节点尾插到结果
  • 复杂度:
    • 时间 O(m+n) 约等于一次遍历(可能提前结束)
    • 空间 O(1) 常量级空间
  • 结果:
    • 执行用时:84 ms, 在所有 JavaScript 提交中击败了84.86%的用户
    • 内存消耗:38.8 MB, 在所有 JavaScript 提交中击败了36.52%的用户
var mergeTwoLists = function(l1, l2) {
    const head = new ListNode(null)
    let curr = head
    while (l1 && l2) {
        if (l1.val < l2.val) {
            curr.next = new ListNode(l1.val)
            l1 = l1.next
        } else {
            curr.next = new ListNode(l2.val)
            l2 = l2.next
        }
        curr = curr.next
    }
    curr.next = l1 ? l1 : l2
    return head.next
};

# 方法 2 递归推进

  • 思路: 对比两链表首位,将后续链表和另一链表递归结果尾接到当前节点.
  • 复杂度:
    • 时间 O(m+n) 约等于一次遍历(可能提前结束)
    • 空间 O(m+n) 存在递归调用栈消耗,且解题非尾递归故无法省去该消耗,约等于遍历次数.
  • 结果:
    • 执行用时:88 ms, 在所有 JavaScript 提交中击败了74.88%的用户
    • 内存消耗:38.8 MB, 在所有 JavaScript 提交中击败了37.98%的用户
var mergeTwoLists = function(l1, l2) {
    if (!l1) return l2
    if (!l2) return l1
    if (l1.val < l2.val) {
        l1.next = mergeTwoLists(l1.next, l2) // 计算未排序部分
        return l1
    } else {
        l2.next = mergeTwoLists(l1, l2.next)
        return l2
    }
};

JS刷题记录 Leetcode-js (opens new window) 每周都会更新刷题心得或者题解, 你的点赞或 star 都将助力我产出更好内容~