Evan Wang
Evan WangFrontEnd Developer
  • Evan Wang
    Evan WangFrontEnd Developer
  • 前端相关
  • 算法题
  • 日常笔记
  • Chat With AI

两数之和
两数相加
无重复字符的最长子串
最长回文子串
盛水最多的容器
三数之和
电话号码的字母组合
有效括号
合并两个有序链表
括号生成
下一个排列
搜索旋转排序数组
在排序数组中查找元素的第一个和最后一个位置
删除链表的倒数第n个节点
组合总和
全排列
旋转图像
字母异位词分组
最大子数组合
跳跃游戏
反转链表
反转链表2
合并区间
最小路径和
编辑距离
颜色分类
爬楼梯
组合
子集
不同的二叉搜索树
验证二叉搜索树
对称二叉树
二叉树的层序遍历
二叉树的最大深度
从前序与中序遍历序列构造二叉树
只出现一次的数字
二叉树展开为链表
最长连续序列
单词拆分
环形链表
环形链表2
排序链表
相交链表
乘积最大子数组
最小栈
多数元素
打家劫舍
数组中重复的数据
二叉树的中序遍历
卖股票的最佳时机
数组中的第K个最大元素

  1. Articles
  1. More
  2. 9-合并两个有序链表.mdx
目录
题目思路方法一方法二
1588 字
约 4 分钟
更新于 2026/08/20

合并两个有序链表

题目:

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

示例 1:

合并两个有序链表题目图片

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []
输出:[]

示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1 和 l2 均按 非递减顺序 排列

思路:

方法一:

利用递归

  • 如果 list1.val <= list2.val ,说明需要将 list1.val 放在结果链表的第一位,
  • 剩下的就是 list1 的第二个值,和 list2 的第一个值进行对比,和上面一样。 代码:
/**
 * 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}
 */
const mergeTwoLists = (list1, list2) => {
        if (!list1) return list2;
        if (!list2) return list1;
 
 
        if (list1.val <= list2.val) {
            list1.next = mergeTwoLists(list1.next, list2);
            return list1
        } else {
            list2.next = mergeTwoLists(list1, list2.next);
            return list2
        }
    }

方法二

每次取两个链表中的最大值,然后放入新链表中。 代码:

const mergeTwoLists = (list1, list2) => {
        if (!list1) return list2;
        if (!list2) return list1;
 
        const resultList = new ListNode();
        let pointer = resultList;
        while (list1 !== null && list2 !== null) {
            if (list1.val >= list2.val) { // 如果 list1.val >= list2.val, 需要将 list2.val 排在 resultList 的前面
                pointer.next = list2; // 将 pointer.next 指向 list2,然后 list2 向后移动一位
                list2 = list2.next;
            } else {
                pointer.next = list1; // 否则,pointer.next 指向 list1,然后 list1 向后移动一位
                list1 = list1.next;
            }
 
            pointer = pointer.next; // 每次循环,pointer 向后移动一位
        }
 
        pointer.next = list1 === null ? list2 : list1 // 处理 list1 或 list2 存在剩余元素的情况
        return resultList.next
    }