hot 100 第二十七题 27.合并两个有序链表

题目:

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

示例 1:

复制代码
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

复制代码
输入:l1 = [], l2 = []
输出:[]

示例 3:

复制代码
输入:l1 = [], l2 = [0]
输出:[0]

核心思路

双指针比较:类似归并排序的合并过程,每次选择两个链表中较小的节点。

复制代码
list1: 1 → 2 → 4
list2: 1 → 3 → 4

合并过程:
比较1和1 → 选1(list1)
比较2和1 → 选1(list2)
比较2和3 → 选2(list1)
比较4和3 → 选3(list2)
比较4和4 → 选4(list1)
剩余4(list2)

结果: 1 → 1 → 2 → 3 → 4 → 4

题解:

java 复制代码
class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        // 创建哑节点,简化边界处理
        ListNode dummy = new ListNode(0);
        ListNode curr = dummy;
        
        // 两个链表都还有节点时,选择较小的
        while (list1 != null && list2 != null) {
            if (list1.val <= list2.val) {
                curr.next = list1;
                list1 = list1.next;
            } else {
                curr.next = list2;
                list2 = list2.next;
            }
            curr = curr.next;
        }
        
        // 连接剩余的节点
        if (list1 != null) {
            curr.next = list1;
        }
        if (list2 != null) {
            curr.next = list2;
        }
        
        return dummy.next;
    }
}
```

### 详细演示
```
list1: 1 → 2 → 4
list2: 1 → 3 → 4

创建哑节点:
dummy → null
curr指向dummy

第1次比较:
------------------
list1.val = 1, list2.val = 1
1 <= 1,选list1

dummy → 1
        ↑
      list1

curr移动: curr = curr.next
list1移动: list1 = list1.next

现在:
dummy → 1 → null
        ↑
       curr
list1 = 2
list2 = 1

第2次比较:
------------------
list1.val = 2, list2.val = 1
2 > 1,选list2

dummy → 1 → 1
            ↑
          list2

curr移动,list2移动

现在:
dummy → 1 → 1 → null
            ↑
           curr
list1 = 2
list2 = 3

第3次比较:
------------------
list1.val = 2, list2.val = 3
2 <= 3,选list1

dummy → 1 → 1 → 2
                ↑
              list1

curr移动,list1移动

现在:
dummy → 1 → 1 → 2 → null
                ↑
               curr
list1 = 4
list2 = 3

第4次比较:
------------------
list1.val = 4, list2.val = 3
4 > 3,选list2

dummy → 1 → 1 → 2 → 3
                    ↑
                  list2

curr移动,list2移动

现在:
dummy → 1 → 1 → 2 → 3 → null
                    ↑
                   curr
list1 = 4
list2 = 4

第5次比较:
------------------
list1.val = 4, list2.val = 4
4 <= 4,选list1

dummy → 1 → 1 → 2 → 3 → 4
                        ↑
                      list1

curr移动,list1移动

现在:
dummy → 1 → 1 → 2 → 3 → 4 → null
                        ↑
                       curr
list1 = null
list2 = 4

循环结束(list1为null)
------------------
连接剩余: curr.next = list2

dummy → 1 → 1 → 2 → 3 → 4 → 4
                            ↑
                          list2

返回 dummy.next
结果: 1 → 1 → 2 → 3 → 4 → 4

本质

合并两个有序链表的核心:

  • 归并思想:类似归并排序的合并过程
  • 双指针:分别指向两个链表,选择较小的
  • 哑节点技巧:简化头节点的处理

这是链表操作的基础题,掌握了迭代和递归两种写法,就能应对各种变体。

相关推荐
404未精通的狗3 小时前
(高阶数据结构)并查集
数据结构
im_AMBER3 小时前
Leetcode 121 翻转二叉树 | 二叉树中的最大路径和
数据结构·学习·算法·leetcode
数智工坊3 小时前
【数据结构-排序】8.3 简单选择排序-堆排序
数据结构
programhelp_5 小时前
特斯拉 MLE 超详细面经 + 避坑
数据结构·人工智能·算法·面试·职场和发展
ShineWinsu5 小时前
对于C++中stack和queue的详细介绍
开发语言·数据结构·c++·面试·stl·queue·stack
v_for_van7 小时前
力扣刷题记录6(无算法背景,纯C语言)
c语言·算法·leetcode
样例过了就是过了7 小时前
LeetCode热题100 最大子数组和
数据结构·算法·leetcode
BackCatK Chen7 小时前
第十五章 吃透C语言结构与数据形式:struct/union/typedef全解析
c语言·开发语言·数据结构·typedef·结构体·函数指针·联合体
Je1lyfish8 小时前
CMU15-445 (2026 Spring) Project#1 - Buffer Pool Manager
linux·数据库·c++·后端·链表·课程设计·数据库架构