1、给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
说明:不允许修改给定的链表
输入:head = [3,2,0,-4]
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。
解题思路:
1、使用快慢指针,先判断是否有环
快指针每一次走两步,慢指针一次走一步。
如果链表存在环,那么快指针与慢指针一定会在环中某个位置相遇。
2、若存在环,此时慢指针
相遇时,fast 指针已经走完了环的 n 圈,因此它走过的总距离为 a+n(b+c)+b=a+(n+1)b+nc。
而slow指针走的距离为 a +b。
同时由 fast = 2*slow,可以得到:
a+(n+1)b+nc=2(a+b) ⟹ a=c+(n−1)(b+c)
由公式可以看出,从两指针相遇点到入环点的距离加上 n−1 圈的环长,恰好等于从链表头部到入环点的距离。
因此,当fast与slow相遇时,额外使用一个指针从head开始走,当head与slow指针相遇时,该位置就是