题目
(1)将两个递增的有序链表[1]合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间。表中不允许有重复的数据。
(1)将两个递增的有序链表[1]合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间。表中不允许有重复的数据。
题目解答
答案
假设两个有序链表为`11`和`12`。下面是详细步骤:
1. 初始化两个指针`p1`和`p2`分别指向`11`和`12`的头部。
2. 初始化一个虚拟头节点`dummy`,和一个指针`current`指向它。这个虚拟头节点将帮助我们建立结果链表。
3. 进入循环,当`p1`和`p2`都不为空时执行以下操作:
比较`p1`和`p2`的值。
如果`p1`的值小于`p2`的值,将`current`的下一个节点设为`p1`,然后将`p1`向前移动。
如果`p2`的值小于`p1`的值,将`current`的下一个节点设为`p2`,然后将`p2`向前移动。
如果两者的值相等,将`current`的下一个节点设为`p1`,然后将`p1`和`p2`都向前移动。
将`current`向前移动。
4. 循环结束后,检查`p1`和`p2`哪一个不为空,并将`current`的下一个节点设为非空链表的剩余部分。
5. 返回`dummy`的下一个节点作为合并后的链表的头节点。
解析
考查要点:本题主要考查有序链表的合并与去重操作,要求在不使用额外存储空间的前提下,将两个递增链表合并为一个无重复数据的递增链表。
解题核心思路:
- 双指针法:同时遍历两个链表,逐个比较节点值,选择较小的节点加入结果链表。
- 去重策略:当两节点值相等时,仅选择其中一个链表的节点,并同时移动两个指针,避免重复。
- 虚拟头节点:简化边界条件处理,无需单独处理头节点。
破题关键点:
- 指针移动逻辑:根据比较结果动态调整指针位置,确保合并后链表的递增性和唯一性。
- 剩余节点处理:循环结束后,直接拼接剩余非空链表的剩余部分。
步骤分解
1. 初始化虚拟头节点与指针
- 创建虚拟头节点
dummy和当前指针current,用于构建结果链表。 - 定义
p1和p2分别指向两个链表的头节点。
2. 循环比较节点值
- 当
p1和p2均不为空时:- 若
p1.val < p2.val:将p1节点加入结果链表,p1前进。 - 若
p2.val < p1.val:将p2节点加入结果链表,p2前进。 - 若值相等:将
p1节点加入结果链表,p1和p2均前进(去重)。 current始终指向结果链表末尾。
- 若
3. 拼接剩余链表
- 循环结束后,若
p1或p2仍有剩余节点,直接将其拼接到结果链表末尾。
4. 返回合并后的链表
- 虚拟头节点的下一个节点即为合并后的链表头节点。