0

0

C++怎么合并两个有序链表_C++数据结构教程【高频】

穿越時空

穿越時空

发布时间:2026-02-23 15:31:54

|

831人浏览过

|

来源于php中文网

原创

mergetwolists需用哑节点+双指针,循环比较取小值并后移,循环后用cur->next = l1 ? l1 : l2接剩余链表,避免空指针解引用和节点遗漏。

c++怎么合并两个有序链表_c++数据结构教程【高频】

mergeTwoLists 函数怎么写才不漏节点

直接用双指针遍历两个链表,谁小取谁,取完就往后挪;但最容易漏的是「其中一个链表走完后,另一个没接全」。很多人只在循环里处理比较逻辑,忘了循环外要手动拼上剩余部分。

常见错误现象:nullptr 访问、结果链表结尾断开、最后一个节点丢失

  • 必须初始化一个哑节点(dummy),避免空链表特判和头节点操作混乱
  • 循环条件用 l1 != nullptr && l2 != nullptr,别用 while (l1 || l2)——容易在某一方为 nullptr 时继续解引用
  • 循环结束后,用 cur->next = l1 ? l1 : l2 接上剩余段,别再写一遍 if-else 判断

示例关键片段:

ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
    ListNode dummy(0);
    ListNode* cur = &dummy;
    while (l1 && l2) {
        if (l1->val <= l2->val) {
            cur->next = l1;
            l1 = l1->next;
        } else {
            cur->next = l2;
            l2 = l2->next;
        }
        cur = cur->next;
    }
    cur->next = l1 ? l1 : l2;
    return dummy.next;
}

递归写法为什么容易栈溢出

递归版简洁,但实际工程中基本不用——它把链表长度直接转成调用栈深度。哪怕只是 10⁵ 级别的有序链表,在默认栈空间下大概率触发 stack overflow

立即学习C++免费学习笔记(深入)”;

使用场景:仅限教学演示或极短链表(

MyMap AI
MyMap AI

使用AI将想法转化为图表

下载
  • 每次递归调用都压入函数帧,含参数、返回地址、局部变量,开销远大于迭代的几个指针变量
  • MSVC 默认栈大小约 1MB,GCC/Linux 默认 8MB,但链表节点数超 10⁴ 就已危险
  • 无法提前终止:即使发现某链表已空,仍需等所有递归返回才能回溯,没法像迭代那样直接跳转

合并过程要不要 new 新节点

不需要,也不应该。原地复用原有节点即可——既省内存,又避免深拷贝带来的值语义歧义(比如节点里有指针成员)。

性能影响明显:每 new 一次就是一次堆分配,O(n) 次分配 + 可能的内存碎片;而复用只是改指针指向,纯 O(1) 操作

  • 只要不修改节点的 val 字段,只调整 next 指针,就完全安全
  • 如果题目明确要求「不能修改原链表」,才考虑深拷贝,但这时应由题干说明,C++ 默认按原地合并理解
  • 注意:返回的是新链表头,但内部节点仍是原链表中的对象,生命周期由调用方保证

LeetCode 提交时报错 member access within null pointer

这是最常卡住人的运行时错误,根本原因是用了 l1->vall1->next 却没先检查 l1 是否为空。

典型发生位置:循环体内、三元表达式右侧、return 前的最后一步

  • 错误写法:if (l1->val val) —— 必须先写 if (l1 && l2) 再比值
  • 安全写法:所有对 -> 的访问前,确保指针非空;宁可多写一行 if (!l1) return l2; 作守卫
  • 调试技巧:本地跑时加断言,比如 assert(l1); assert(l2);,快速暴露空指针路径

事情说清了就结束:合并本身不难,难的是边界全想到、空指针全防住、内存不乱 new。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

828

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

103

2023.09.25

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

544

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

27

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

39

2026.01.06

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

422

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

595

2023.08.10

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

23

2025.11.16

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1127

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 18.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号