【学习笔记】数据结构(链表合并 双指针合并有序链表)

一、双指针合并有序链表

1、概念

两个升序单向链表,合并成一条升序单向链表,不额外开辟大量数组空间,优先使用双指针法。

单向链表节点 C 语言标准定义:2、 双指针核心思路

1、虚拟头结点 (dummy 节点)

创建一个临时空节点,作为新链表起点,避免单独处理链表为空的边界情况,大幅简化代码。

2、定义移动指针cur,初始指向 dummy,用来不断拼接新节点。

3、l1、l2两个指针分别遍历两条原始链表:

如果l1->val <= l2->val:cur 的下一个接 l1,l1 向后走

否则:cur 的下一个接 l2,l2 向后走

4、cur = cur->next 向后移动

5、循环结束条件:其中一条链表遍历完毕

6、把剩下没有遍历完的整条链表直接接到 cur 后面(链表剩余部分本身有序,不用循环)

7、最终结果:dummy->next(舍弃虚拟头)

  1. 高频易错点

1、不要丢失头结点,一定要用 dummy

2、 链表指针移动顺序不能写反

3、 最后剩余节点直接拼接,不要再循环遍历

4、不要随便修改原始链表以外节点,避免野指针

5、 忘记NULL判空,引发段错误

  1. 算法复杂度

时间复杂度:O(m+n),m、n 为两条链表长度,每个节点只访问一次

空间复杂度:O(1),只新增一个 dummy 节点,原地合并

二、题目 合并两个有序链表

解题思路:

1、建立虚拟头结点统一链表操作

2、同时遍历两条链表,每次选取数值更小的节点接到 cur 后面

3、其中一条链表走完,直接把另一条链表剩余部分接上

4、返回dummy->next作为合并链表起点

解题:

1、dummy虚拟节点:不存有效数据,作用统一 "链表为空" 边界,不用单独判断 list1、list2 是否 NULL。

2、cur = dummy:cur 是建造新链表的 "尾指针",永远指向新链表最后一个节点。

3、while(list1 && list2):只要两条链表都还有节点,持续比较。

cur->next = list1:把小节点连到新链表尾部

list1 = list1->next:原链表指针向后挪,准备下一轮比较

4、cur = cur->next:新链表尾部向后移动,保证下一次接在最后。

5、退出 while:至少一条链表遍历完成。剩下节点本身有序,直接cur->next挂载整条,不需要逐个循

环。

6、return dummy->next:抛弃我们手动 malloc 出来的虚拟头,返回真正第一个有效节点。

相关推荐
春弦_12 小时前
自用算法整理二
数据结构·算法·图论
Young Doro13 小时前
独立性检测学习任务
人工智能·学习·数据挖掘
Young Doro13 小时前
从 DV 表示到 MI 下界,再到“置换技巧“(含“指数倾斜“完整推导)
笔记
卡卡~~14 小时前
“101计划”核心课程实践教材《数据实验结构指导-C++语言版》题目集
开发语言·c++·学习·算法
lengxuenong15 小时前
树状数组 · 信息学学习手册1-求和3个模板
c++·学习·算法·青少年编程
ACP广源盛1392462567316 小时前
PCIe Gen3 交换芯片选型笔记:中小通道扩展方案 IX7012@ACP 评估
笔记·硬件架构·硬件工程·pcie·国产芯片
lanxiaoqing0216 小时前
演讲训练的第一步:先敢说,再会说
人工智能·学习·学习方法·口才
职豚求职小程序刷题16 小时前
国投证券笔试测评题型揭秘
笔记
Nuanyt16 小时前
LeetCode Hot100 刷题笔记 · 普通数组专题
java·笔记·算法·leetcode
xxxiugou12317 小时前
链表算法题精讲:从两数相加到K组翻转
数据结构·c++·算法·链表