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

本质

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

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

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

相关推荐
To_OC5 小时前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
To_OC5 小时前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode
兰令水5 小时前
hot100【acm版】【2026.7.14打卡-java版本】
java·数据结构·算法·leetcode·面试
cpp_25015 小时前
P10098 [ROIR 2023] 地铁建设 (Day 2)
数据结构·c++·算法·贪心·二分答案·洛谷题解
米尔的可达鸭8 小时前
深入操作系统 Socket 底层:套接字控制块、FD映射、阻塞IO核心完整实现
arm开发·数据结构·websocket·网络协议·算法·架构·安全架构
tachibana29 小时前
hot100 课程表(207)
java·数据结构·算法·leetcode
旖-旎9 小时前
《LeetCode 646 最长数对链 || LeetCode 1143 最长公共子序列》
c++·算法·leetcode·动态规划
Frostnova丶9 小时前
(15)LeetCode 189. 轮转数组
数据结构·算法·leetcode
罗超驿10 小时前
6.Java LinkedList深度解析:从链表原理到源码实践
java·开发语言·链表
来一碗刘肉面11 小时前
顺序表的按值查找
数据结构·c++·算法