leetcode 面试题 02.08. 环路检测

https://leetcode-cn.com/problems/linked-list-cycle-lcci/solution/huan-lu-jian-ce-by-leetcode-solution-s2la/

法1:hash

法二 快慢指针:

在这里插入图片描述

一个快指针f 每次走两步
一个慢指针l 每次走一步

当他们第一次相遇的时候,快指针与慢指针都过了a,
并且快的比慢的多走了n个b,n是整数
由于

因为两者速度差值和l的速度是一样的
重点是,此时l也走了n个b的长度,虽然可能不在环的入口
这个时候需要把l走到环的入口
就让l再走a即可
所以让一个指针在head的地方和l一起走
然后相遇的时候就是入口了

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        
        bool cy = false;
        
        auto f = head;
        auto l = head;
        while(f!=nullptr && f->next!=nullptr){
            f = f->next->next;
            l = l->next;
            if(f == l){
                cy = true;
                break;
            }
        }
        
        if(!cy){
            return nullptr;
        }
        
        f = head;
        while(true){
            
            if(f == l){
                break;
            }
            
            f = f->next;
            l = l->next;
            
        }
        return l;
    }
};

在这里插入图片描述

相关推荐
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页