/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//看到环形链表首先就要想到快慢指针
struct ListNode *detectCycle(struct ListNode *head) {
//设置快慢指针
struct ListNode *fast,*slow;
fast=head;
slow=head;
//做算法题不能只靠脑子纯想方法,有时候需要列图列表去计算(列是动词)
//首先 我们要知道 快慢指针在环形链表内一定会相遇 那么什么时候相遇?
//这时候纯想想不出的 我们要设坐标点 设从head到入口的距离是x,从入口到相遇的地方的距离是y,从相遇的地方再到入口是z
//快慢指针都是从head出发 也就是pos=0出发 相遇的时候 快慢指针之前会不会《擦肩而过》呢?
//我们设置的是慢指针走一步 快指针走两步 在慢指针进入入口的那一刻开始,快指针就以相对慢指针的每次一步的速度接近慢指针,所以在快慢指针相遇时,之前不会《擦肩而过》
//我们可以简单得出 相遇时 慢指针走的步数是 slow = x+y
//而快指针步数是 fast = n*(y+z) + (x+y); 其中n指在相遇时快指针多走了n圈,n>=1
//同时 fast = (n-1)*(y+z) + (x+y) + y + z
//故 2*slow = fast 即 2*(x+y) = (n-1)*(y+z) + (x+y) + y + z
//可以得到等式 x+y=(n-1)*(y+z) + y + z 即 x=(n-1)*(y+z) + z
//可以很简单知道,(n-1)*(y+z)只是圈数,从头到入口 和 从相遇处到入口 距离是一样的
//即x=z
//代码就很简单了
while(fast!=NULL&&fast->next!=NULL){
slow=slow->next;
fast=fast->next->next;
if(slow==fast){
struct ListNode *index1=head;
struct ListNode *index2=slow;
while(index1!=index2){
index1=index1->next;
index2=index2->next;
}
return index1;
}
}
return NULL;
}
leetcode力扣142题环形链表Ⅱ
最新推荐文章于 2026-07-03 11:23:30 发布
1541

被折叠的 条评论
为什么被折叠?



