题目描述
对于一个给定的链表,返回环的入口节点,如果没有环,返回null
拓展:
你能给出不利用额外空间的解法么?
题解:
判断环有个很巧妙的方法,之前说过一次,用快慢指针
一个指针一次走一步,另一个一次走两步,两个指针存在速度差,只要存在环,两个指针必会相遇,如果快指针都走到头了还没相遇,那就没了
如何判断环的入口节点?
我继续用上文的慢指针,然后在设一个新的指针
让两个指针一步一步的跑,因为慢指针现在在环上,会在环上一种循环,而新指针还未进环,所以当两者相遇时就是在环的入口
代码:
/** * 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==NULL||head->next==NULL)return NULL;
ListNode *slow=head->next;
ListNode *fast=head->next->next;
ListNode *a=head;
while(fast!=slow)
{
if(fast==NULL||fast->next==NULL)return NULL;
slow=slow->next;
fast=fast->next->next;
}
while(a!=slow)
{
a=a->next;
slow=slow->next;
}
return a;
}
};