142.环形链表
初见思路:修改节点,每个节点里面加一个sequence,如果下一个的seq小于当前节点的seq,就存在环。
改良后:快慢指针,快每次2个节点,慢每次1个节点。
两个人在跑步,甲比乙快,甲迟早会套乙 圈。所以若存在环,快指针一定会追上慢指针。又因为相对速度为1,乙跑一圈,甲一定赶上。
如何确定环的入口呢?
设:链表 到 环入口 距离为x
入口 到 相遇位置 距离为y
相遇位置 到 入口 距离为z
则:慢指针 走了 x+y
快指针 走了x+y+n(y+z)
所以2(x+y)=x+y+n(y+z)
化简后 x=n(y+z)-y
其中y+z就是一圈
把-变+:x=z+(n-1)圈 因为n=1
所以 x=z
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode *fast=head;
ListNode *slow=head;
while(fast!=nullptr&&fast->next!=nullptr){
slow=slow->next;
fast=fast->next->next;
if(fast==slow){
ListNode *index1=fast;
ListNode *index2=head;
while(index1!=index2){
index1=index1->next;
index2=index2->next;
}
return index2;
}
}
return nullptr;
}
};