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

一、双指针合并有序链表

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 出来的虚拟头,返回真正第一个有效节点。

相关推荐
风之清扬1 小时前
Agent学习之四-初识Agent CLI
人工智能·科技·学习
传奇开心果编程1 小时前
【xilem0.4基础语法学与练】第45课 xilem_core
学习·rust·前端框架
Vcaker1 小时前
Linux学习28-Kubernetes service
linux·运维·学习
ysu_03141 小时前
19-插入排序与希尔排序
数据结构·算法·排序算法
问心无愧05131 小时前
ctf show web 178
前端·笔记
ljt27249606612 小时前
Vue笔记--路由
javascript·vue.js·笔记
那年窗外下的雪.2 小时前
AIDC 学习日志|第 25 天|设备输出反推、MAC Flapping 与 EAD 撤销
前端·网络·git·学习·macos
郝学胜-神的一滴2 小时前
C++11 工程级应用 12:编译期类型魔法,干掉重复与臃肿的代码
开发语言·数据结构·c++·软件工程·visual studio
kyle~2 小时前
数据结构---红黑树
数据结构