牛客TOP101-判断链表中是否有环

news2024/11/16 1:20:57

前言

本文以Java为语言讲解【判断链表中是否有环】这一题,题目来源【牛客TOP101】

题目描述

在这里插入图片描述
输入用例
在这里插入图片描述

解题思路

Hash表法

对于这道题,比较容易想到的可能是使用hash表,因为如果是有环,那么就意味着,在遍历过程中,hash表中记录的节点一定会被记录再次访问,那么就可以确定是是否有环

代码实现如下:

public class Solution {
    public boolean hasCycle(ListNode head) {
        ListNode cur = head;
        Set<ListNode> hash = new HashSet<ListNode>();
        while (cur != null) {
            if (hash.contains(cur)) {
                return true;
            } else {
                hash.add(cur);
            }
            cur = cur.next;
        }
        return false;
    }
}

空间复杂度是O(N),时间复杂度为O(N)

双指针

链表有环问题,比较优秀的解法是使用双指针,也就是使用快慢指针(slow,fast)

快慢指针,快指针每次走两步,慢指针每次走一步,那么快指针的速度就是慢指针的两倍,那么假设有环存在,快指针就必定会在某个点与慢指针相遇

这个我们很容易理解,就像同学之间跑步,A的速度快,B的速度慢,只要圈数足够的情况下,A一点会在跑道上再次和B相遇,只不过A此时比B多跑了一圈。

代码实现如下:

public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head == null){
            return false;
        }
        ListNode slow = head;
        ListNode fast = head.next;
        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
            if(slow == fast){
                return true;
            }
        }
        return false;
    }
}

可能有些朋友不能理解为什么fast = head.next, slow = head(我一开始就不明白),其实很简单,快慢指针的定义就是前者走两步,后者走一步,一开始二者都在起跑线上,而head就是一步,head.next就是两步,所以初始化上,就是fast = head.next, slow = head,图示如下:
在这里插入图片描述

双指针算法的时间复杂度为O(N),空间复杂度为O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1119414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++之类和对象

1.auto 可以自动推导结果的类型 typeid()可以打印类型 引用也可以 auto真正的价值可以简化迭代器的写法 并且auto定义的变量必须初始化。 不能做参数 返回值也不可以用auto auto不能用来声明数组 如果想要修改要用引用且指针不好解决。 c11之后的nullptr 以后再用空指针用nul…

qt采用C++/CLI 方式调用C#dll的封装方法(高阶应用)

简单讲讲需求&#xff1a;cpp作为主程序&#xff0c;c#作为第三方程序被调用&#xff0c;并且需要在c#代码里调用主程序里的方法 C#写的dll是没有dllMain入口函数的&#xff0c;是一种中间语言&#xff0c;需要.Net运行时进行做本地化工作&#xff0c;因此如果要调用C#写的dll…

OpenStack云计算平台实战-----创建空白虚拟机

1、创建空白虚拟机 需要注意的步骤会截图一下&#xff0c;其它的基本都是下一步&#xff0c;默认的即可 建议将虚拟机命名为自己的名字加后缀 将处理器数量和每个处理器的内核量都修改为2 将虚拟机的内存设置为8G&#xff0c;不然不够用 将指定磁盘大小设置为200G&#xff0c;…

面试题:什么是微服务 ?

文章目录 微服务是什么微服务是什么样的服务化的前提服务的发布与引用声明式Restful API服务的注册与发现一致性与可用性注册方式存储结构服务健康监测状态变更通知 服务的远程通信网络I/O的处理传输协议序列化方式 注册中心如何保障稳定性节点信息的保障服务节点的摘除服务节点…

微信分销小程序商城的作用是什么

众人拾柴火焰高&#xff0c;分销商城值得是商家通过一定比列的佣金或奖品激励会员或用户分销商品/服务的手段&#xff0c;以低成本获得高收益&#xff0c;也成为不少线上线下商家寻求增长的一种方法。 商家难以完善“引流拓客-转化-留存-复购-裂变-分享”等路径&#xff0c;导…

游戏反虚拟框架检测方案

游戏风险环境&#xff0c;是指独立于原有设备或破坏设备原有系统的环境。常见的游戏风险环境有&#xff1a;iOS越狱、安卓设备root、虚拟机、虚拟框架、云手机等。 因为这类风险环境可以为游戏外挂、破解提供所需的高级别设备权限&#xff0c;所以当游戏处于这些设备环境下&am…

Element UI 密码输入框--可切换显示隐藏,自定义图标

<el-form-item prop"password"><el-inputkeyup.enter.native"login"placeholder"密码"v-model"formData.password":type"showPassword ? text : password"><i slot"suffix" click"switchPas…

策略模式在社会中的应用

文章目录 &#x1f31f; 如何将设计模式策略模式运用到社会当中&#x1f34a; 什么是策略模式&#x1f34a; 策略模式在社会中的应用&#x1f389; 1. 政治选举&#x1f389; 2. 商业竞争&#x1f389; 3. 教育培训 &#x1f34a; 策略模式的优缺点&#x1f389; 优点&#x1f…

SSM - Springboot - MyBatis-Plus 全栈体系(三十三)

第八章 项目实战 终极实战&#xff1a;SpringBoot 版微头条实战 一、微头条案例介绍 1. 微头条业务简介 用户功能 注册功能登录功能jwt 实现 头条新闻 新闻的分页浏览通过标题关键字搜索新闻查看新闻详情新闻的修改和删除 2. 技术栈介绍 2.1 前端技术栈 ES6 作为基础 J…

操作系统——信号量机制(王道视频p30、课本ch6)

1.记忆有技巧&#xff1a;PV操作 —— wait,signal ——肯定是先申请/等待&#xff0c;再释放 2.这里特别指出 记录型信号量就是 后面会重点研究的内容

软件测试肖sir__python之ui自动化实战和讲解(03)

python之ui自动化实战和讲解 一、讲解常见控件定位 链接&#xff1a;http://cms.duoceshi.cn/cms/manage/login.do 1、定位文本框&#xff0c;密码框&#xff0c;按钮 2. 输入 &#xff1a;send_keys()方法 3、点击 &#xff1a;click&#xff08;&#xff09; 方法 案例&…

uniapp在线预约到家按摩系统安装部署二次开发 可以搭建H5公众号+小程序+APP

后端Thinkphp框架开发。前端采用uni-app开发&#xff0c;适配多端&#xff08;小程序&#xff0b;公众号H5&#xff0b;APP&#xff09;源码全开源。 Nginx1.22.1Mysql5.6php7.3redis扩展 支持h5、公众号、小程序、APP&#xff0c;提供相关教程和详细功能文档&#xff01; 含开…

LeetCode算法刷题(python) Day41|09动态规划|理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

目录 动规五部曲LeetCode 509. 斐波那契数LeetCode 70. 爬楼梯LeetCode 746. 使用最小花费爬楼梯 动规五部曲 确定dp数组以及下标的含义确定递归公式dp数组如何初始化确定遍历顺序举例推导dp数组 LeetCode 509. 斐波那契数 力扣题目链接 本题最直观是用递归方法 class Sol…

GIL全局解释器锁

文章目录 GIL全局解释器锁一、引入&#xff1a;二、GIL介绍三、GIL与Lock四、GIL与多线程总结 GIL全局解释器锁 一、引入&#xff1a; 首先要明白&#xff0c;GIL并不是Python的一个特性&#xff0c;其实在我们通常所称呼的Python解释器&#xff0c;其实是CPython解释器&…

excel, 熟悉了一般应用的函数,为何还有必要学vba

背景&#xff1a; 1. win10, office 2016, hp Elitebook笔记本电脑 2. 统计数量时&#xff0c;在sheet &#xff08;工作表&#xff09;页面使用函数 sum通过类似 sum(c6:c8) 进行求和&#xff0c;其中C7未被计算在内&#xff0c;例子见图片或附件。即使使用 “数据透视表”…

基于QT的学生考勤系统

低价有偿-获取代码&#xff1a; 知识付费时代&#xff0c;低价有偿获取代码&#xff0c;请理解&#xff01; (1) 下载链接: 后补。 (2) 添加博主微信获取&#xff08;有偿&#xff09;,备注来源: mryang511688 项目描述 技术&#xff1a;C、QT等 摘要&#xff1a; 信息技术的迅…

【Andriod】Appium的不同版本(Appium GUI、Appium Desktop、Appium Server )的安装教程

文章目录 前言一.Appium GUI二.Appium Desktop三.Appium Server 命令行版本1.安装node.js2.安装Appium Server 前言 Appium 安装提供两2方式&#xff1a;桌面版和命令行版。其中桌面版又分为 Appium GUI 和 Appium Desktop。 建议&#xff1a;使用Appium Desktop 一.Appium …

ubuntu安装Anaconda

下载 Anaconda 进入 Ubuntu&#xff0c;自己新建下载路径&#xff0c;输入以下命令开始下载 注意&#xff0c;如果不是 x86_64&#xff0c;需要去镜像看对应的版本&#xff08;https://mirrors.bfsu.edu.cn/anaconda/archive/?CM&OA&#xff09; wget https://mirrors.…

【Java 进阶篇】深入了解 Bootstrap 表格和菜单

表格和菜单是网页设计中的重要组成部分&#xff0c;它们用于展示数据、导航和用户交互。Bootstrap 是一个强大的前端框架&#xff0c;提供了丰富的表格样式和菜单组件&#xff0c;使开发者能够轻松创建功能丰富的网页。在本文中&#xff0c;我们将深入探讨 Bootstrap 中表格和菜…

火热的“出海潮”背后,你还应该知道些什么?

点击文末“阅读原文”即可报名参会 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 联合制作 / RTE开发者社区 过去几十年&#xff0c;入华的科技企业“走进来”&#xff0c;加速了国内企业的数…