双指针技巧-链表题&解
参阅基础
简介
双指针,指的是在遍历对象的过程中,不使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。
换言之,双指针法充分使用了数组(或链表)有序这一特征,从而在某些情况下能够简化一些运算。
对于单链来说,大部份技巧都属于快慢指针。
此外,链表算法题还有个很常见的「虚拟头结点」技巧。就是在实际的链表头前放一个 dummy
节点,作为占位符,可以避免处理空指针的情况,降低代码的复杂性。
相关习题
LeedCode 21.合并两个有序链表
题目
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
来源:https://leetcode.cn/problems/merge-two-sorted-lists/
示例 1:
1 | 输入:l1 = [1,2,4], l2 = [1,3,4] |
示例 2:
1 | 输入:l1 = [], l2 = [] |
示例 3:
1 | 输入:l1 = [], l2 = [0] |
提示:
- 两个链表的节点数目范围是
[0, 50]
-100 <= Node.val <= 100
l1
和l2
均按 非递减顺序 排列
我的题解
1 | /** |
LeedCode 86.分隔链表
题目
给你一个链表的头节点 head
和一个特定值 x
,请你对链表进行分隔,使得所有 小于 x
的节点都出现在 大于或等于 x
的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
来源:https://leetcode.cn/problems/partition-list/
示例 1:
1 | 输入:head = [1,4,3,2,5,2], x = 3 |
示例 2:
1 | 输入:head = [2,1], x = 2 |
提示:
- 链表中节点的数目在范围
[0, 200]
内 -100 <= Node.val <= 100
-200 <= x <= 200
我的题解
1 | /** |
LeedCode 19. 删除链表的倒数第 N 个结点
题目
难度中等2187收藏分享切换为英文接收动态反馈
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
来源:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/
示例 1:
1 | 输入:head = [1,2,3,4,5], n = 2 |
示例 2:
1 | 输入:head = [1], n = 1 |
示例 3:
1 | 输入:head = [1,2], n = 1 |
提示:
- 链表中结点的数目为
sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
我的题解
核心技巧:快慢指针
1 | /** |
LeedCode 141.环形链表
注意:Leetcode的运行机制(根据输入执行实例构建题目的数据结构)
题目
给你一个链表的头节点 head
,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos
不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true
。 否则,返回 false
。
来源:https://leetcode.cn/problems/linked-list-cycle/
示例 1:
1 | 输入:head = [3,2,0,-4], pos = 1 |
示例 2:
1 | 输入:head = [1,2], pos = 0 |
示例 3:
1 | 输入:head = [1], pos = -1 |
提示:
- 链表中节点的数目范围是
[0, 104]
-105 <= Node.val <= 105
pos
为-1
或者链表中的一个 有效索引 。
我的题解
1 | /** |