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

本质

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

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

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

相关推荐
Yupureki12 小时前
《Linux系统编程》19.线程同步与互斥
java·linux·服务器·c语言·开发语言·数据结构·c++
967712 小时前
C++ Lambda 表达式 匿名函数 sort
数据结构·c++·算法
liuyao_xianhui12 小时前
优选算法_锯齿形层序遍历二叉树_队列_C++
java·开发语言·数据结构·c++·算法·链表
想带你从多云到转晴12 小时前
03、数据结构与算法--单向链表
java·数据结构·算法
老四啊laosi13 小时前
[双指针] 4. 力扣--盛最多水的容器
算法·leetcode·装水最多的容器
迈巴赫车主13 小时前
蓝桥杯192.等差数列java
java·数据结构·算法·职场和发展·蓝桥杯
凌盛羽13 小时前
在MDK-ARM编译后用python解析map文件在编译窗口输出Flash和RAM使用及剩余情况
arm开发·python·stm32·单片机·mysql·链表·esp32
老虎062713 小时前
数据结构09(Java)-- 二分查找模板
java·开发语言·数据结构
Rabitebla13 小时前
快速排序(QuickSort)完全指南 —— 从原理到工业级优化
c语言·数据结构·c++·算法·github
XiYang-DING14 小时前
【LeetCode】206. 反转链表
算法·leetcode·链表