参考链接:代码随想录:LeetCode142-环形链表II
总结下来就是fast指针走两步,slow指针走一步,如果相遇了,在相遇点B那里,然后链表头假设为点A,那么再次设置两个指针fast idx,slow idx,分别从链表头A点和相遇点B出发,fast idx和slow idx每次只走1步,如果相遇了,那么fidx和sidx相遇点就是环的入口节点,该结论要记住,推导过程在参考链接里面!
class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode* f=head,*s=head,*fidx,*sidx;if(!head||!head->next){return NULL;}while(f&&f->next){s=s->next;f=f->next->next;if(f==s){fidx=head;sidx=s;while(fidx!=sidx){fidx=fidx->next;sidx=sidx->next;}if(fidx==sidx){return fidx;}}}return NULL;}
};