struct ListNode *detectCycle(struct ListNode *head) { struct ListNode*fast=head; struct ListNode*slow=head; while(fast&&fast->next){ fast=fast->next->next; slow=slow->next; if(fast==slow){ struct ListNode*meet =slow; while(meet!=head){ meet=meet->next; head=head->next; } return meet; } } return NULL; }
具体说说思路
1.快慢指针和慢指针相交,我们可以设她两个相交点距离环入口距离为x, 从头到环入口距离为L
慢指针走的距离是L+X
快指针则是L+X+nC(C是环长,也就是运动会中的扣圈)
然后快指针是慢指针速度的二倍,所以路程也会是二倍 所以L=nc-x=(n-1)c+x
2.那么从个相遇点开始另外来一个指针也就是meet,让meet和head一起走,head是走一个L, meet是走c-x的距离,因为L=c-x+(n-1)c(c是圈哈)
所以meet会和head在环的入口相遇。
部分疑问
1. 快慢指针的速度问题,快指针一定是两个两个的吗?这时候想假如有环的话快慢指针早晚一定都会进去,当慢指针进去的时候,可以认为时间静止,慢指针不动,这时快指针的速度减一,也就是说在他们相遇之前,在环中最重要的是相对距离,快指针速度变为一后,会走遍整个环,也就是肯定会遇到慢指针,如果速度为3或4,大家可以自己想一想,可以在评论区和我沟通