【LeetCode热题100】--142.环形链表II

news2024/11/16 2:19:56

142.环形链表II

image-20230928110734297

使用哈希表:

遍历链表中的每个节点,并将它记录下来,一旦遇到了此前遍历过的节点,就可以判定链表中存在环

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        //使用哈希表
        ListNode pos = head;
        Set<ListNode> visited = new HashSet<ListNode>();
        while(pos!=null){
            if(visited.contains(pos)){
                return pos;
            }
            else{
                visited.add(pos);
            }
            pos = pos.next;
        }
        return null;
    }
}

使用双指针:

这类链表题目一般都是使用双指针法解决的,例如寻找距离尾部第 K 个节点、寻找环入口、寻找公共尾部入口等。

在本题的求解过程中,双指针会产生两次“相遇”。

双指针的第一次相遇:

  • 设两指针 fast,slow 指向链表头部 head 。
  • 令 fast 每轮走 2步,slow 每轮走 1 步。

执行以上两步后,可能出现两种结果:

  • 第一种结果: fast 指针走过链表末端,说明链表无环,此时直接返回 null。

如果链表存在环,则双指针一定会相遇。因为每走 1 轮,fast 与 slow 的间距 +1,fast 一定会追上 slow 。

  • 第二种结果: 当fast == slow时, 两指针在环中第一次相遇。下面分析此时 fast 与 slow 走过的步数关系:

设链表共有 a+b 个节点,其中 链表头部到链表入口 有 a个节点(不计链表入口节点), 链表环 有 b 个节点(这里需要注意,a 和 b 是未知数,例如图解上链表 a=4 , b=5);设两指针分别走了f,s 步,则有:

  • fast 走的步数是 slow 步数的 2倍,即 f=2s;(解析: fast 每轮走 2步)
  • fast 比 slow 多走了 n个环的长度,即 f=s+nb;( 解析: 双指针都走过 a 步,然后在环内绕圈直到重合,重合时 fast 比 slow 多走 环的长度整数倍 )。

将以上两式相减得到 f=2nb,s=nb,即 fast 和 slow 指针分别走了 2n,n 个环的周长。

接下来该怎么做呢?

如果让指针从链表头部一直向前走并统计步数k,那么所有 走到链表入口节点时的步数 是:k=a+nb ,即先走 a步到入口节点,之后每绕 1 圈环( b 步)都会再次到入口节点。而目前 slow 指针走了 nb 步。因此,我们只要想办法让 slow 再走 a 步停下来,就可以到环的入口。

但是我们不知道 a 的值,该怎么办?依然是使用双指针法。考虑构建一个指针,此指针需要有以下性质:此指针和 slow 一起向前走 a 步后,两者在入口节点重合。那么从哪里走到入口节点需要 a 步?答案是链表头节点head。

双指针第二次相遇:

  • 令 fast 重新指向链表头部节点。此时 f=0,s=nb 。
  • slow 和 fast 同时每轮向前走 1 步。
  • 当 fast 指针走到 f=a步时,slow 指针走到 s=a+nb步。此时两指针重合,并同时指向链表环入口,返回 slow 指向的节点即可。
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        //使用双指针
        ListNode fast = head,slow = head;
        while(true){
            if(fast == null || fast.next == null){
                return null;
            }
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow){
                break;
            }
        }
        fast = head;
        while(slow!=fast){
            slow = slow.next;
            fast = fast.next;
        }
        return fast;
    }
}

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

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

相关文章

Unity Urp无线延申的网格效果

无线延申的网格 该项目必须是再Urp项目 shader代码实现 Shader "Unlit/infTutorial1" {Properties{_Alpha ("Alpha", Range(0, 0.5)) 0.5}SubShader{Tags{"RenderPipeline""UniversalRenderPipeline""RenderType""…

操作系统监控工具

在当今复杂、动态的网络环境中&#xff0c;服务器管理员根据其要求在各种操作系统上工作&#xff0c;操作系统是管理硬件和软件资源的基本系统软件&#xff0c;它是硬件与您运行的不同应用程序之间的接口&#xff0c;保持操作系统更新至关重要&#xff0c;最重要的是&#xff0…

SDI-12协议与STM32 进行uart通信

场景是用stm32与一款温湿度传感器通信&#xff0c;不过是基于SDI-12协议&#xff0c;SDI-12时序和UART类似&#xff0c;故采用UART传输&#xff0c;原理图如下 其中DIR_OUT_SDI是一个IO引脚&#xff0c;控制UART_TX_SDI是否使能&#xff0c;U10是三态门IC&#xff0c;即拉低DIR…

测试网页调用本地可执行程序(续1:解析参数中的中文编码)

学习测试网页调用本地可执行程序还遗留一个问题&#xff0c;即网页中调用带中文参数的命令时&#xff0c;本地可执行程序接收到的参数字符串里的中文都转换成了编码模式&#xff0c;看起来如下所示&#xff1a; <a href TestPageCall:-a你好>启动测试程序</a><…

destoon根据查询标题小于5个字符的数据进行删除

最近客户有个需求&#xff0c;就是他采集的时候&#xff0c;标题有些小于5字符的短标题的垃圾数据&#xff0c;进行清空处理&#xff0c;让我进行批量删除。废话不多说&#xff0c;接着干。 首先在dt根目录新建delmysql.php文件&#xff0c;代码如下&#xff1a; <?php r…

机器学习——KNN算法流程详解(以iris为例)

目 录 前情说明 问题陈述 数据说明 KNN算法流程概述 代码实现 前情说明 本书基于《特征工程入门与入门与实践》庄家盛 译版P53也K最近邻&#xff08;KNN&#xff09;算法进行讲解 问题陈述 Iris 鸢尾花数据集内包含 3 类分别为山鸢尾&#xff08;Iris-setosa&#xff09…

99%的亚马逊运营都不知道爆单小技巧——社媒促销代码

社交媒体促销代码是促进产品在亚马逊上销售的最有效推广方式之一&#xff0c;有了这个营销工具&#xff0c;卖家可以在社交媒体上宣传您的产品&#xff0c;并通过社交媒体和网红营销内容将促销代码分享给买家&#xff0c;进行更具针对性的促销。 一、什么是社交媒体促销代码 社…

BoxUVMap处理参考

该Shader的目标是让物体的位置作为UV&#xff0c;在物体自身UV没有正确展开的情况下保证物体各个面能够避免贴图拉伸&#xff0c;比较适合Box型的物体。本来Position节点和Normal Vector节点应该选择Object选项&#xff0c;但是当时选择了World选项&#xff0c;主要是应对项目的…

在亚马逊云科技Amazon SageMaker上部署构建聊天机器人的开源大语言模型

开源大型语言模型&#xff08;LLM&#xff09;已经变得流行起来&#xff0c;研究人员、开发人员和组织都可以使用这些模型来促进创新和实验。这促进了开源社区开展合作&#xff0c;从而为LLM的开发和改进做出贡献。开源LLM提供了模型架构、训练过程和训练数据的透明度&#xff…

超大表格组件滚动渲染优化

引用自 摸鱼wiki 背景 业务中需要渲染一个最多有100列的表格&#xff0c;由于表格使用原生dom实现&#xff0c;因此会出现同屏有近1000个单元格同时绘制&#xff0c;在快速滑动时页面会产生卡顿&#xff0c;影响用户体验。 方案 如下图所示&#xff0c;由于用户显示屏区域有…

LeetCode算法二叉树—222. 完全二叉树的节点个数

目录 222. 完全二叉树的节点个数 - 力扣&#xff08;LeetCode&#xff09; 代码&#xff1a; 运行结果&#xff1a; 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能…

opencv开发环境配置

一、下载安装 打开opencv官方网站&#xff0c;opencv管网地址&#xff0c;选择下载的版本 双击安装包&#xff0c;选择安装路径&#xff0c;进行安装 安装完毕后&#xff0c;打开 注意&#xff1a;环境变量配置的bin路径不是build/bin&#xff0c;而是build/x64/vc16/bin …

chrome扩展程序开发请求接口报错

解决HTTPS站点请求HTTP接口服务后报错&#xff1a;the content must be served over HTTPS Mixed Content: The page at <URL> was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint <URL>. This content should also be served over HTTPS…

网络知识:内网、外网、宽带、带宽、流量、网速之间的联系?

相信很多人都不知道内网、外网、宽带、带宽、流量、网速之间的区别与联系&#xff0c;今天小编给大家介绍一下&#xff0c;希望对大家能有所帮助&#xff01; 一.带宽与宽带的区别是什么&#xff1f; 带宽是量词&#xff0c;指的是网速的大小&#xff0c;比如1Mbps的意思是一兆…

数据库系统课设——基于python+pyqt5+mysql的酒店管理系统(可直接运行)--GUI编程(2)

几个月之前写的一个项目&#xff0c;通过这个项目&#xff0c;你能学到关于数据库的触发器知识&#xff0c;python的基本语法&#xff0c;python一些第三方库的使用&#xff0c;包括python如何将前后端连接起来&#xff08;界面和数据&#xff09;&#xff0c;还有界面的设计等…

Guava限流器原理浅析

文章目录 基本知识限流器的类图使用示例 原理解析限流整体流程问题驱动1、限流器创建的时候会初始化令牌吗&#xff1f;2、令牌是如何放到桶里的&#xff1f;3、如果要获取的令牌数大于桶里的令牌数会怎么样4、令牌数量的更新会有并发问题吗 总结 实际工作中难免有限流的场景。…

振弦采集仪结合无线中继扩展应用岩土工程监测的解决方案

振弦采集仪结合无线中继扩展应用岩土工程监测的解决方案 岩土工程监测是现代工程建设不可或缺的一部分&#xff0c;其目的是确保工程安全和稳定。然而&#xff0c;在进行监测时常常面临许多挑战。传统的岩土工程监测方法需要大量的人力、物力和时间&#xff0c;而且往往难以采…

顽固污渍一键去除,还有紫外线除菌功能,希亦超声波清洗机体验

日常生活中&#xff0c; 眼镜、牙刷等小物件的清洗该怎么清洗呢&#xff1f;如果使用肥皂水或者专业清洁剂来处理&#xff0c;还需要使用一些小工具来帮助清洁&#xff0c;比如清洁布、棉签等&#xff0c;不仅会很麻烦&#xff0c;而且需要频繁擦拭&#xff0c;镜片等物品光滑的…

601-体育馆的人流量

文章目录 601-体育馆的人流量1. 题目2. 思路3. 解决4. 运行结果 601-体育馆的人流量 1. 题目 2. 思路 思路&#xff1a;查询Stadium表中人流量超过100的记录&#xff0c;将查询结果与自身的临时表连接&#xff0c;再使用where获得满足条件的记录 查询Stadium表中人流量超过10…

现代数据中心发明人Luiz André Barroso去世,享年59岁,Jeff Dean、劈柴发推悼念

Luiz Andr Barroso因故去世&#xff0c;享年59岁。他作为现代云计算行业的奠基人&#xff0c;为谷歌的发展做出了不可磨灭的贡献。 数据中心发明人&#xff0c;云计算的奠基人&#xff0c;谷歌22年老兵Luiz Andr Barroso于9月16日意外去世&#xff0c;享年59岁。 谷歌CEO 劈柴…