题目描述
给定一个链表,如果存在环,则返回环的入口;否则返回null。
注意:请不要修改链表。
进一步:能否只是用额外 O(1)O(1) 的空间?
思路
https://www.acwing.com/solution/LeetCode/content/241/
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
if(!head||!head->next) return NULL;
ListNode *first = head,*second = head;
while(first&&second){
first = first->next;
second = second->next;
if(second) second = second->next;
else return NULL;//前面部分和上一部分相同,通过昭贵率我们发现,相遇点顺时针走到环形起点处的距离,和从头结点走到起点的距离相同,因此设一个点在相遇点,一个点在头结点,二者相遇就是入口点
if(second == first){
first = head;//一个设位头结点
while(first!=second){
first=first->next;//同时移动,直到相遇
second = second->next;
}
return first;
}
}
return NULL;
}
};