快慢指针
快慢指针通常用来解决链表上的环的问题。
思想是fast和slow指针以不同速度移动,fast每次移动两步,slow每次移动一步,如果快指针追上慢指针则说明链表中存在环。也可也用来找链表的中点。
LeetCode 141. 环形链表
本题只要求判断有无环,用最简单的快慢指针即可。
1 | /** |
LeetCode 142. 环形链表 II
这题难点在于找到入环节点
当快慢指针相遇的时候
head 到 slow的距离 X
环入口到 slow 距离 Y
slow到环入口为 Z
slow走过的距离为 x+y
fast 走过的距离为 x + y + k(z + y)
fast = 2 slow
2(x + y) = x + y + k(z + y)
x = (k - 1)(y + z) + z
因为 y + z为环的长度,所以当走了(k - 1)(y + z)距离时可以看作回到原点,所以 x = z
此时将另外一个指针和慢指针同时每次走一步,相遇的地方就是入环节点。
1 | /** |