LeetCode 21. 合并两个有序链表
📌 题目描述
题目级别:简单
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
- 示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
💡 破题思路:Dummy 节点与拉链法
合并两个有序链表的过程,非常像我们在给衣服拉拉链 :
拉链的左右两排锯齿就是 list1 和 list2,拉链头就是我们的比较逻辑,谁比较小,谁就先卡进拉链的轨道里。
核心高光点 (Dummy Node):
合并链表时,最大的痛点是**"第一个节点到底选谁"。如果不做特殊处理,就必须在循环外写一堆 if (list1->val < list2->val) 来决定头指针。
为了优雅地避开这个问题,我们可以人为制造一个 虚拟头节点 (dummy)**!
这样一来,无论是哪个链表的节点,统统当做小弟,往 dummy 屁股后面接就行了。最后返回结果时,直接返回 dummy->next,深藏功与名。
💻 C++ 代码实现 (迭代法最优解)
cpp
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
// 创建一个虚拟头节点,避免处理合并后链表头为空的边界情况
ListNode* dummy = new ListNode();
ListNode* cur = dummy;
// 当两个链表都还没走完时,互相比较,谁小谁上
while (list1 && list2)
{
if (list1->val <= list2->val)
{
cur->next = list1;
list1 = list1->next;
}
else
{
cur->next = list2;
list2 = list2->next;
}
// 拼接好一个节点后,当前指针往后挪一步,准备接下一个
cur = cur->next;
}
// 循环结束后,肯定有一个链表先空了
// 把另一个还没空的链表,剩下的一大串直接挂在末尾即可
cur->next = list1 ? list1 : list2;
return dummy->next;
}
};