来源:环形链表II
题目描述:
思路:(本质上是数学题)
1.判断是否有环
设计两个指针slow fast步幅为1和2,如果链表有环,则两个指针最终指向同一节点。
2.找环的入口
假设长度为
x:入口到两指针相遇
y:相遇到入口
z:头指针到入口
第一次指针相遇:
slow=z+x
fast=z+x+n(y+x) // n(y+z)fast转了n圈
因为fast步幅为slow的2倍,fast=2slow -> 2(z+x)=z+x+n(y+x)
化简得:z+x=n(y+x)
因为最后目标得到入口,因此等数左侧只留下 z
z=n(y+x)-x //消去括号外x
z=(n-1)(y+x)+y // (n-1)(y+x) 为n-1个环 不影响结果
此时得到z与y 相等就可以得到入口
设计指针 n1 n2 相等位置就是入口节点*
代码
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode*slow =head;
ListNode*fast=head;
while(fast!=NULL&&fast->next!=NULL){
slow=slow->next;
fast=fast->next->next;
if(fast==slow){
ListNode*n1=slow;
ListNode*n2=head;
while(n1!=n2){
n1=n1->next;
n2=n2->next;
}
return n1;
}
}
return NULL;
}
};