牛客题霸 [链表中环的入口节点] 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;
        
    }
};