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

一、双指针合并有序链表

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

相关推荐
YLCHUP10 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
LGL6030A11 小时前
Java学习历程31——初识Spring Boot
java·spring boot·学习
阿达和自己12 小时前
springboot学习-springboot引入MyBatis-Plus
spring boot·学习·mybatis
旖旎夜光12 小时前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
nice_lcj52013 小时前
LRU 缓存入门:它是什么、怎么用、面试怎么手写
java·数据结构·缓存·面试·lru
꧁细听勿语情꧂14 小时前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法
星恒随风1 天前
MySQL 从零入门(五):MySQL 内置函数详解——日期、字符串、数学函数与实战案例
linux·数据库·笔记·sql·mysql
§ꦿCFོ༉1 天前
嵌入式八股文—C语言入门学习(四)
c语言·开发语言·学习
2603_969694851 天前
【JavaWeb学习记录】MyBatis核心知识点与实战笔记:从入门到动态SQL
笔记·sql·学习·mysql·mybatis·javaweb·学习方法
Pniubi1 天前
关于算法用现成数据结构和手撕
数据结构