牛客题霸 [链表中环的入口节点] C++题解/答案

牛客题霸 [链表中环的入口节点] 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;
        
    }
};
posted @ 2020-11-30 11:00  回归梦想  阅读(83)  评论(0编辑  收藏  举报