题目描述
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目分析
我们假设起点到环的入口点的距离是L,入口点到相遇点的距离是X,环的长度是C
那么画图我们可以得知:
- 从开始到相遇时slow走的距离是L+X
- 从开始到相遇时fast走的距离是L+n*C+X
(n:slow进环前,fast已经在环里走了 n 圈)
由于fast=slow*2,所以我们可以得到结论:一个指针从相遇点开始走,一个指针从头开始走,最终会在入口点相遇
我们可以画图来证明一下:
代码示例
根据这个思路我们可以写出代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode *slow,* fast;
slow=fast=head;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)//相遇
{
struct ListNode *meet=slow;
while(head!=meet)
{
head=head->next;
meet=meet->next;
}
return meet;
}
}
return NULL;
}
结果当然也是通过了