142.环形链表2
142.环形链表2
给定一个链表的头节点 head
,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos
是 -1
,则在该链表中没有环。注意:pos
不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
示例 1:
1 | 输入:head = [3,2,0,-4], pos = 1 |
示例 2:
1 | 输入:head = [1,2], pos = 0 |
示例 3:
1 | 输入:head = [1], pos = -1 |
哈希表的解法太简单了,应该使用快慢指针
Solution
算法中快慢指针相遇点和环入口点之间的距离关系,关键的理解是这样的:
- 快慢指针首次相遇时,我们可以得到如下关系:当快慢指针相遇时,假设慢指针从链表起点走了 ( $L$ ) 步,那么快指针则走了 ( $2L$ ) 步(因为快指针的速度是慢指针的两倍)
设:
- a 是从链表起点到环入口点的距离。
- b 是从环入口点到快慢指针相遇点的距离。
- c 是从快慢指针相遇点回到环入口点的距离。
我们可以列出以下等式来描述快慢指针的行走:
- 慢指针走的总距离:$( a + b)$
- 快指针走的总距离:$( a + b + n(b + c) )$ 其中 $( n )$ 是快指针在环内走的完整圈数。
因为快指针走的距离是慢指针的两倍,所以:
解这个等式,我们得到:
这里的关键点是:从链表起点到环入口的距离 ( $a$ ) 等于从相遇点回到环入口的距离 ( $c$ ) 加上 ( $n-1$ ) 圈环的长度。实际上就是$a=c$,因为$n$可以取任何值!
所以移动相同地的距离,最后会在入口处相遇
1 | // 定义Solution类 |