AcWing 34 链表中环的入口节点
题目
给定一个链表,若其中包含环,则输出环的入口节点
若其中不包含环,则输出null
样例
1 | 给定如上所示的链表: |
思路
这道题解法很巧妙,有一股数学的气息,首先我们回忆一下怎么确定一个链表中是否存在环
我们是使用快慢指针的方式来确定链表中是否存在环的,两个指针one
和two
都从链表的head
出发,one
每次走一个节点,two
每次走两个节点,如果链表存在环的情况下,两个指针一定会在环中的某个位置相遇,否则如果two
走到了链表结尾,说明链表没有环
那我们如何确定链表中环的入口节点呢?请看这张图
首先,我们假设入口节点b
距离head
节点a
的距离为x
,两个指针相遇的点c
距离b
点的长度是y
,那么,one
指针走到b
需要x
步,而此时two
指针已经走了2x
步,正在环中某处(假设链表存在环),而当one
再走y
步就会到达两个指针相遇的c
点,再次期间,two
同样会走2y
步,所以,在one
到达b
点时,two
实际距离b
点y
步,也就是说,这个环的长度为x + y
,所以我们可以得到,当two
在c
点时,它距离b
点差x
步
通过这个结论,我们可以在两个指针相遇时,让one
指回头节点,此时one
距离b
点差x
步,two
距离b
点也为x
步,从这个时候开始,我们让两个指针每次走一个单位,当两个指针再次相遇时,这个点就是b
点,代码如下:
代码
1 | class Solution { |