0021.合并两个有序链表

难度:🟢 简单

标签递归链表

链接21. 合并两个有序链表

题目描述

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:

输入:list1 = [1,2,4], list2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

输入:list1 = [], list2 = []
输出:[]

示例 3:

输入:list1 = [], list2 = [0]
输出:[0]

解题思路

核心思想

本题的核心思想是比较两个链表当前节点的大小,将较小的节点接入到结果链表中,然后移动相应链表的指针,重复此过程直到所有节点都被合并。这是一个典型的归并排序中“合并”步骤的简化版。

思路选择

迭代法 + 虚拟头节点(Dummy Head) 是解决此问题的常用且高效的思路。

  • 虚拟头节点:创建一个临时的 dummy 节点作为新链表的伪头节点。这样做的好处是,我们可以用一个统一的逻辑来处理所有节点的插入,而无需为新链表的第一个节点编写特殊的处理代码。

  • 迭代:使用一个 while 循环,只要两个链表都还有节点,就持续进行比较和链接操作。

关键步骤

  1. 初始化:创建一个虚拟头节点 dummy = new ListNode(),并创建一个 node 指针指向它,node 将作为新链表的尾指针,负责链接新的节点。

  2. 循环比较:当 list1list2 都不为空时,进行循环: a. 比较 list1.vallist2.val 的大小。 b. 将值较小的那个节点链接到 node.next。 c. 将被链接的那个链表的头指针向后移动一步。 d. 将 node 指针也向后移动一步,使其始终指向新链表的尾部。

  3. 处理剩余部分:循环结束后,list1list2 中最多还有一个链表有剩余节点。由于它本身已经有序,我们直接将 node.next 指向这个剩余的链表即可。

  4. 返回结果dummy 节点的 next 指针指向的就是合并后新链表的真正头节点,返回 dummy.next

代码实现

/**
 * 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) {
    // 创建一个虚拟头节点,简化边界处理
    let dummy = new ListNode();
    // node 作为指针,用于构建新链表
    let node = dummy;

    // 当两个链表都不为空时
    while (list1 !== null && list2 !== null) {
        if (list1.val < list2.val) {
            node.next = list1;
            list1 = list1.next;
        } else {
            node.next = list2;
            list2 = list2.next;
        }
        node = node.next;
    }

    // 处理其中一个链表已经遍历完的情况
    node.next = list1 !== null ? list1 : list2;

    // 返回虚拟头节点的下一个节点,即新链表的头
    return dummy.next;
};

复杂度分析

  • 时间复杂度O(m + n) 其中 m 和 n 分别为两个链表的长度。我们最多需要遍历完两个链表的所有节点。

  • 空间复杂度O(1) 我们只使用了常数个额外变量作为指针,没有使用与输入规模成正比的额外空间。

相关题目

总结

本题是链表操作的基础题,也是面试中的高频题。其迭代解法中使用的“虚拟头节点”(Dummy Head)技巧非常重要,它能极大地简化链表头部操作的逻辑,是处理链表问题时必须掌握的模式之一。

Copyright © Jun 2025 all right reserved,powered by Gitbook该文件修订时间: 2025-07-03 17:35:08

results matching ""

    No results matching ""

    results matching ""

      No results matching ""