一,定义
快指针fast每次走两步,慢指针slow每次走一步
%表示取模运算
二,判断是否有环
刚开始时fast和slow都在链表头;
- 如果链表无环,那fast和slow指针不可能相遇,且最终fast=null
- 如果链表有环,记开始位置到环入口长度为k,环长为R,那么t时刻(t>=k),fast在环上(2t-k)%R的位置,slow在环上(t-k)%R的位置,当(2t-k)%R=(t-k)%R时,t=n*R,所以快慢指针一定相遇,相遇点在(-k)%R
三,寻找环入口
快慢指针相遇时,它们都在(-k)%R处;
让快指针从头开始一步一步走,慢指针也走,那么当快指针走到环入口时,慢指针走到了
((-k)%R+k)%R=(-k)%R%R+k%R=(-k)%R+k%R=0%R=0处,此时快慢指针再次相