题目描述
题目链接:力扣(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;
}
结果当然也是通过了