class Solution {
public:
ListNode *detectCycle(ListNode *head) {
if(head == NULL || head->next == NULL) return NULL;
ListNode *fast = head;
ListNode *slow = head;
while(fast && fast->next){
fast = fast->next->next;
slow = slow->next;
if(slow == fast) break;
}
if(fast != slow) return NULL;
fast = head;
while(fast != slow){
fast = fast->next;
slow = slow->next;
}
return fast;
}
};
以上是AC代码
还是利用双指针法:fast slow 两指针
这道题的关键是要明白:
如果有环的话: //以下结论的证明可以在网上搜一搜
首先fast和slow两个指针一定会相遇!!
第一次相遇之后,退出循环,记录相遇时的slow指针 然后把fast 指针重新放回链表开头
第二次相遇时,就是环的入口 然后返回入口节点即可。