代码随想录-环形链表II

题目与解析       

题目链接:环形链表II

本题两个关键点,1、确定有环 2、确定环的入口位置

 提供两种解法,第一种是我借助了一个辅助的列表来记录指针,空间复杂度O(n)比较无脑

  第二种是Carl哥的双指针法,又是套圈问题,虽然很难想,但还是推荐这种方式,这才是算法

解法一:

public class Solution {public ListNode detectCycle(ListNode head) {//方法一、O(n)的辅助空间。记录的一定不能是val,一定是ListNode,搞个list记录一下它List nodeList = new ArrayList<ListNode>();ListNode curNode = head;while(curNode!=null){if(nodeList.contains(curNode)){return curNode;}nodeList.add(curNode);curNode = curNode.next;}return null;}
}

解法二:快慢指针

思路

方法二采用快慢两个指针的方式,(1)如果快慢指针相遇,则说明有环 (2)有环确定环的入口,借助数学公式推理。

先来个图标注一下环形链表的x、y、z(引用自网站代码随想录代码随想录)

  1. 假设有环,快指针相对于慢指针每次移动一个距离,所以必然会相遇,可以自己推一下
  2. 那么相遇时快慢指针相遇时走过的路程的比值是 1:2  => 2(x+y) = x+y+n(y+z)  整理得 x=n(y+z)-y = (n-1)(y+z)+z
  3. 当n=1时,说明快指针只走了一圈就与慢指针相遇 => x=z,此时让两个指针分别从head和相遇处出发,两个指针相遇刚好是入口
  4. 当n>1 时,无非是从环里出发的指针在环里多走了几圈,但是相遇位置是一样的,还是入口

代码

public class Solution {public ListNode detectCycle(ListNode head) {//方法二//方法二采用快慢两个指针的方式,(1)如果快慢指针相遇,则说明有环 (2)有环确定环的入口,借助数学公式推理//假设有环,快指针相对于慢指针每次移动一个距离,所以必然会相遇,可以自己推一下//那么相遇时快慢指针相遇时走过的路程的比值是 1:2  => 2(x+y) = x+y+n(y+z)  整理得 x=n(y+z)-y = (n-1)(y+z)+z//当n=1时,说明快指针只走了一圈就与慢指针相遇 => x=z,此时让两个指针分别从head和相遇处出发,两个指针相遇刚好是入口//当n>1 时,无非是从环里出发的指针在环里多走了几圈,但是相遇位置是一样的,还是入口处ListNode fast = head;ListNode slow = head;while(fast!=null&&fast.next!=null){fast = fast.next.next;slow = slow.next;//相遇了,说明有环if(slow == fast){//搞两个指针 1从head出发,2从当前位置出发ListNode p1 = head;ListNode p2 = slow;while(p1!=p2){p1 = p1.next;p2 = p2.next;}return p1;}}return null;}
}

总结

  1. 链表问题两大法宝 ① 虚拟头结点 ②双指针(最多的就是快慢指针)
  2. 链表部分最后两道题都涉及到数学归纳,多少有点难,想不出来就背背吧,再遇到类似的能做出来就行了

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「毅硕|生信教程」 micromamba:mamba的C++实现,超越conda

1 Micromamba 简介 大家是否有这样的经历&#xff0c;使用conda/anaconda进行环境配置的是否速度非常慢&#xff0c;进度经常卡在“Collecting package metadata”上。甚至有时候需要安装的软件比较多&#xff0c;或者需要用到conda-forge这个最大的channel&#xff0c;conda能…

Windows环境下Qt Creator调试模式下qDebug输出中文乱码问题

尝试修改系统的区域设置的方法&#xff1a; 可以修复问题。但会出现其它问题&#xff1a; 比如某些软件打不开&#xff0c;或者一些软件界面的中文显示乱码&#xff01; 暂时没有找到其它更好的办法。

渗透基础-rcube_webmail版本探测

简介 本文介绍了开源产品RoundCube webmail邮件系统的版本探测思路&#xff0c;并用go语言实现工具化、自动化探测。 正文 0x01 探测思路研究 探测系统版本&#xff0c;最理想的方法就是系统主页html代码中有特定的字符串&#xff0c;比如特定版本对应的hash在主页的html代…

【开源免费】基于SpringBoot+Vue.JS母婴商城系统 (JAVA毕业设计)

本文项目编号 T 030 &#xff0c;文末自助获取源码 \color{red}{T030&#xff0c;文末自助获取源码} T030&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

OpenCV高级图形用户界面(11)检查是否有键盘事件发生而不阻塞当前线程函数pollKey()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 轮询已按下的键。 函数 pollKey 无等待地轮询键盘事件。它返回已按下的键的代码或如果没有键自上次调用以来被按下则返回 -1。若要等待按键被按…

【Ansiable】ansible的模块和主机清单

目录 一、介绍一些运维自动化工具 二、Ansible 概述/简介 三、Ansible 工作机制 3.1 内部工作机制 3.2 外部工作机制 四、Ansible 执行流程 五、Ansblie 安装以及日常操作模块***** 5.1 ansible 环境安装部署 5.2 ansible 命令行模块 5.2.1 command 模块 5.2.2 shel…

大数据-177 Elasticsearch Query DSL - 聚合分析 指标聚合 桶聚合

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

VSCode设置用鼠标滚轮控制字体大小

VSCode设置用鼠标滚轮控制字体大小 1. 在左下角&#xff0c;打开设置选项&#xff1a; 2. 找到字体设置&#xff0c;直接修改配置文件&#xff1a; 3. 在配置文件中添加如下内容&#xff1a; "editor.mouseWheelZoom": true别忘了上一行要以逗号结尾。 4. 按住ctrl…

西圣、酷盟和绿联哪款平替电容笔好?三款电容笔真实测评对比

随着越来越多的人开始体验无纸化学习和办公&#xff0c;电容笔成为了一个广受欢迎的iPad配件。而原装电容笔价格太高&#xff0c;如果能有性能相当&#xff0c;价格低廉的替代品&#xff0c;无疑会减轻一些经济负担。因此&#xff0c;平替电容笔应运而生&#xff0c;成为了许多…

Node-RED开源项目的modbus通信(TCP)

一、Modbus 通信协议 Modbus是一种串行通信协议&#xff0c;是Modicon公司&#xff08;现在的施耐德电气 Schneider Electric&#xff09;于1979年为使用可编程逻辑控制器&#xff08;PLC&#xff09;通信而发表。Modbus已经成为工业领域通信协议的业界标准&#xff08;De fact…

FineReport 模板参数查询示例

通过模板参数实现&#xff0c;参数为空查询全部 参数无值时查询全部&#xff0c;则在查询前&#xff0c;需要先判断参数是否有值&#xff0c;有值则执行过滤&#xff1b;无值则不过滤。 1、新建数据集 ds1 SELECT * FROM S订单2、添加模板参数 3、单元格配置 $货主地区 &qu…

【Triton教程】向量相加

Triton 是一种用于并行编程的语言和编译器。它旨在提供一个基于 Python 的编程环境&#xff0c;以高效编写自定义 DNN 计算内核&#xff0c;并能够在现代 GPU 硬件上以最大吞吐量运行。 更多 Triton 中文文档可访问 →https://triton.hyper.ai/ 在本教程中&#xff0c;你将使…

Golang | Leetcode Golang题解之第485题最大连续1的个数

题目&#xff1a; 题解&#xff1a; func findMaxConsecutiveOnes(nums []int) (maxCnt int) {cnt : 0for _, v : range nums {if v 1 {cnt} else {maxCnt max(maxCnt, cnt)cnt 0}}maxCnt max(maxCnt, cnt)return }func max(a, b int) int {if a > b {return a}return …

Android TextView实现一串文字特定几个字改变颜色

遇到一个需求&#xff0c;让Android端实现给定一个字符串指定下标的几个字颜色与其他字颜色不一致。 主要是用ForegroundColorSpan这个API来传入颜色值&#xff0c;用SpannableString来设置指定索引下标的字的颜色值。 这里通过给定一个输入文字描述框&#xff0c;要求输入指定…

线上问题排查-常见的线上问题

一、线上问题排查思路 明确问题&#xff1a;首先&#xff0c;需要明确线上出现了什么问题。这包括了解问题的具体表现、发生的时间、影响的范围等。通过收集用户反馈、查看监控系统告警等方式&#xff0c;收集问题相关信息。收集信息&#xff1a;收集与问题相关的各种信息&…

BIO CHINA2025生物发酵展高歌猛进,规模再升级, 亮点及活动发布,精彩就在此刻!

BIO CHINA2025生物发酵展高歌猛进&#xff0c;规模再升级&#xff0c; 亮点及活动发布&#xff0c;精彩就在此刻&#xff01; 目前国家高度重视生物经济与生物技术产业的发展&#xff0c;出台了一系列政策措施支持行业发展。生物发酵行业作为现代生物经济的重要支柱&#xff0…

【原创】java+ssm+mysql校园在线答疑管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

Scrapy | 爬取笑话网来认识继承自Spider的crawlspider爬虫类

crawlspider 1. 创建crawlspider爬虫2. 实战-爬取笑话网笑话 本篇内容旨在拓展视野和知识&#xff0c;了解crawlspider的使用即可&#xff0c;主要熟悉掌握spider类的使用 CrawlSpider 提供了一种更高级的方法来定义爬取规则&#xff0c;而无需编写大量的重复代码。它基于规则…

Pseudo Multi-Camera Editing 数据集:通过常规视频生成的伪标记多摄像机推荐数据集,显著提升模型在未知领域的准确性。

2024-10-19&#xff0c;由伊利诺伊大学厄巴纳-香槟分校和香港城市大学的研究团队提出了一种创新方法&#xff0c;通过将常规视频转换成伪标记的多摄像机视角推荐数据集&#xff0c;有效解决了在未知领域中模型泛化能力差的问题。数据集的创建&#xff0c;为电影、电视和其他媒体…

【论文学习与撰写】,论文word文档中出现乱码的情况,文档中显示的乱码,都是英文字母之类的,但打印预览是正常的

目录 1、问题 2、解决方法 1、问题 写论文的时候&#xff0c;有时会出现乱码的情况&#xff0c; 如下图&#xff0c;这种情况&#xff0c; 可是 在打印预览的时候&#xff0c;就显示的正常 如下图&#xff0c; 2、解决方法 既然是文档正文显示错误&#xff0c;显示乱码&…