您的位置:首页 >C++单链表合并方法详解
发布于2026-02-09 阅读(0)
扫一扫,手机访问
直接用merge函数出错因STL的std::list::merge要求两链表已排序且原地合并,而手写链表无此成员函数;归并需双指针比较+尾插,哨兵节点可简化边界处理。

merge 函数会出错?STL 的 std::list::merge 要求两个链表都已排序,且调用后左侧链表成为合并结果,右侧链表被清空。但很多人误以为它能返回新链表,或忽略“原地合并”特性——调用前若 list1 和 list2 都非空,list2 末尾节点的 next 指针可能未置为 nullptr,导致遍历时越界。
更常见的是:自己手写链表(非 std::list),却照搬 STL 接口名,结果编译不通过——因为 merge 不是内置函数,必须自己实现。
merge 成员函数std::list::merge 只接受同类型、已排序的 std::list,不适用于自定义节点结构用哨兵节点(dummy node)可避免对首节点的特殊判断,代码更干净。核心是双指针比较 + 尾插。
struct ListNode {
int val;
ListNode* next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
};
ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummy;
ListNode tail = &dummy;
while (l1 && l2) {
if (l1->val <= l2->val) {
tail->next = l1;
l1 = l1->next;
} else {
tail->next = l2;
l2 = l2->next;
}
tail = tail->next;
}
tail->next = l1 ? l1 : l2;
return dummy.next;
}
dummy.next,不是 &dummy需要单独处理第一个节点,容易漏判空指针或写错初始赋值。常见错误是:在进入循环前没给 head 赋值,或把 tail 初始化成 nullptr 后直接解引用。
if 分支确定 head 和 tail 指向哪个节点nullptr合并逻辑看似简单,但以下输入常让代码崩溃或返回错误结果:
l1 = nullptr, l2 = [1→2→3]l1 = l2 = nullptr[1→1→2] 和 [1→3→3] → 应输出 [1→1→1→2→3→3][1] 和 [2→3→4→5→6],确保尾插逻辑不漏掉剩余部分真正难的不是写完,而是验证所有分支都被执行过;尤其 tail->next = l1 ? l1 : l2 这一行,如果前面忘了更新 tail,就会断链。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9