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

本质

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

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

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

相关推荐
xlp666hub14 小时前
Leetcode第五题:用C++解决盛最多水的容器问题
linux·c++·leetcode
哈里谢顿1 天前
跳表(Skip List):简单高效的有序数据结构
数据结构
xlp666hub1 天前
Leetcode 第三题:用C++解决最长连续序列
c++·leetcode
xlp666hub2 天前
Leetcode第二题:用 C++ 解决字母异位词分组
c++·leetcode
xlp666hub2 天前
Leetcode第一题:用C++解决两数之和问题
c++·leetcode
任沫2 天前
字符串
数据结构·后端
祈安_3 天前
Java实现循环队列、栈实现队列、队列实现栈
java·数据结构·算法
NineData4 天前
数据库管理工具NineData,一年进化成为数万+开发者的首选数据库工具?
运维·数据结构·数据库
琢磨先生David12 天前
Day1:基础入门·两数之和(LeetCode 1)
数据结构·算法·leetcode
qq_4542450312 天前
基于组件与行为的树状节点系统
数据结构·c#