一、双指针合并有序链表
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、不要丢失头结点,一定要用 dummy
2、 链表指针移动顺序不能写反
3、 最后剩余节点直接拼接,不要再循环遍历
4、不要随便修改原始链表以外节点,避免野指针
5、 忘记NULL判空,引发段错误
- 算法复杂度
时间复杂度: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 出来的虚拟头,返回真正第一个有效节点。