牛客题霸 [链表中环的入口节点] C++题解/答案
题目描述
对于一个给定的链表,返回环的入口节点,如果没有环,返回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;}
};