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

一、双指针合并有序链表

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

相关推荐
笑鸿的学习笔记8 小时前
C++笔记之大块顺序写
java·c++·笔记
for_ever_love__8 小时前
机器学习入门——手写线性回归与梯度下降
人工智能·python·学习·机器学习·线性回归
在猴站学算法8 小时前
(SQL注入学习)无回显的报错注入(Error-Based)
学习·网络安全·sql注入·ctf竞赛
lvwangshu9 小时前
登录日志 题解
数据结构·线段树·题解·技巧·性质题·思维好题·细节题
CQU_JIAKE9 小时前
10.2【A】
数据结构
C++ 老炮儿的技术栈10 小时前
不一样的数值交换
数据结构·c++·人工智能·算法·c·csdn开发云
山岚的运维笔记10 小时前
ComfyUI NVIDIA安装教程:官方便携版下载+run_nvidia_gpu.bat启动,8G显存Windows实操
运维·服务器·windows·笔记·prompt·aigc·comfyui
知识分享小能手10 小时前
C++ 学习教程,从入门到精通,C++ 友元、异常和其他特性 — 详细知识点(15)
开发语言·c++·学习
青山木11 小时前
Hot 100 --- 编辑距离
java·数据结构·算法·leetcode·动态规划
fanged11 小时前
Camera学习2(V4L2和Media Controller)(TODO)
学习