当前位置: 首页 > article >正文

Leetcode141. 环形链表(HOT100)

链接

我的代码:

class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(!head||!head->next)return false;
        ListNode* last = head;
        ListNode*slow = head;
        while(last&&last->next){
            last = last->next->next;
            slow = slow->next;
            if(last==slow){
                return true;
            }
        }
        return false;
    }
};

另一种做法:

class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(!head||!head->next)return false;
        unordered_set<ListNode*> visited;
        ListNode*cur = head;
        while(cur){
            if(visited.count(cur)){
                return true;
            }
            visited.insert(cur);
            cur = cur->next;
        }
        return false;
    }
};

 另一种做法:

class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(!head||!head->next)return false;
        ListNode*s = head,*f = head->next;
        while(f){
            s = s->next,f = f->next;
            if(!f){
                return false;
            }
            f = f->next;
            if(s==f){
                return true;
            }
        }
        return false;
    }
};

一和三都是快慢指针做法,它的时间复杂度是O(N)的。 

比如:链表没有环,那么快指针会遍历链表一遍,慢指针遍历一半,共3/2n,所以是O(N);

如果有环:

如上图,快指针走了2x步,慢指针走了x步,何时相遇呢?

 

注:当慢指针走到环入口时,快指针可能在环内已经走了很多圈或者一圈,总之,快指针在环的某个位置,此时慢指针在入口处。然后快指针移动两步,慢指针移动一步, 相对速度为1,也就是说每循环一次,他们的距离减少1,那么如果它们距离为K的话,循环K次,它们就会相遇。

 


http://www.kler.cn/a/409723.html

相关文章:

  • FFmpeg 音视频同步问题
  • ODBC连接PostgreSQL数据库后,网卡DOWN后,客户端进程阻塞问题解决方法
  • 基于SpringBoot的数据结构系统设计与实现(源码+定制+开发)
  • 零基础学指针(上)
  • Vue进阶面试题(三)
  • 【君正T31开发记录】8.了解rtsp协议及设计模式
  • 字符串编码
  • 数组的应用
  • Burp学习(1)
  • 【Linux课程学习】:环境变量:HOME,su与su - 的区别,让程序在哪些用户下能运行的原理,环境变量具有全局性的原因?
  • 【笔记】Linux下编译Python3.10.15为动态库同时正确处理OpenSSL3依赖
  • 搭建帮助中心,打造卓越的用户体验
  • 基于神经网络的流量异常检测
  • 【CSS】页面滚动到一定位置时,指定区域固定不变
  • Vue.js 组件开发实例分析
  • 基于基于DCT的数字水印算法
  • 【离散数学】特殊关系的矩阵表示
  • NLP论文速读(Apple出品)|迈向更好的多模态指令遵循能力评估
  • Vue.js --- Vue3中其他组合式API
  • 语言模型中的多模态链式推理
  • 【Linux】线程ID与互斥、同步(锁、条件变量)
  • 第4章 三个域对象
  • 深度解析:Vue 自定义指令到底是什么?快来了解
  • 鸿蒙面试题-某迈-2024年11月22日
  • 对于某些原型或UI软件的个人看法(2024/11)
  • 【Qt】控件LineEdit