图解LeetCode——142. 环形链表 II

news2024/11/18 5:31:42

一、题目

给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表

二、示例

2.1> 示例 1:

输入】head = [3,2,0,-4], pos = 1
输出】返回索引为 1 的链表节点
解释】链表中有一个环,其尾部连接到第二个节点。

2.2> 示例 2:

输入】head = [1,2], pos = 0
输出】返回索引为 0 的链表节点
解释】链表中有一个环,其尾部连接到第一个节点。

2.3> 示例 3:

输入】head = [1], pos = -1
输出】返回 null
解释】链表中没有环。

提示:

  • 链表中节点的数目范围在范围 [0, 10^4] 内
  • -10^5 <= Node.val <= 10^5
  • pos 的值为 -1 或者链表中的一个有效索引

进阶:

  • 你是否可以使用 O(1) 空间解决此题?

三、解题思路

根据题目描述,我们需要返回链表开始入环的第一个节点。那么我们会最先想到的解题方式就是,创建一个Set集合,然后遍历整个链表,当遍历到某个节点的时候,发现该节点已经存在于Set集合中,则表示找到了入环的第一个节点,返回该节点即可。

但是本题在进阶部分提出了一个问题:你是否可以使用 O(1) 空间解决此题?那么我们就不能通过创建Set集合去解决这个问题了。那么我们来分析一下这个链表,以下图为例,我们将其拆分为非环形状a环形形状b两个部分。那么采用快慢指针fast&slow)的方式去遍历链表,由于快指针的速度是慢指针的2倍,所以我们可以得出以下结论,即:

fast指针行走的距离 = slow指针行走的距离 * 2;(我们简写为:fast= 2*slow

那么fast指针肯定先进入到循环链表中,随后slow指针才会进入到循环链表中,那么无论在链表中哪个节点处fast和slow相遇,我们都可以得出一个结论,即:

fast指针在循环链表中行走的距离 = slow指针在循环链表中行走的距离 * n圈 * b;(例如:跑步比赛被套圈了,此处我们简写为 fast = slow * nb

如果以slowfast在环中相遇的那个节点node为基准,那么,fast指针行走的总长度其实包含两个部分:

第1部分】从链表head开始到node的距离为:slow的行走距离
第2部分】以node为起始节点,fast行走的距离为:N圈*b

因此,我们可以得出如下推论:

因为fast = 2slow,并且fast = slow + Nb;
所以slow = N*b;

那么入环的第一个节点会是在哪个位置呢?其实就是a + Nb,那么我们就可以通过slow指针与fast指针的两次相遇,来计算出这个节点的位置了:

步骤1】slow行走1步,fast行走2步,当fast与slow相遇的时候,就是slow的行走距离,也就是Nb
步骤2】此时将fast指针指向head头节点,然后fast变为每次只行走1步,那么当fast行走了a距离的时候,就满足了 a + Nb长度了,fast和slow必然会相遇,而且是在入环的第一个节点位置上

以上就是本题的解题思路了,在下图中,通过举例的方式,一步一步的演示其执行逻辑,如下是步骤1的执行图例,请见下图所示:

如下是步骤2的执行图例,请见下图所示:

四、代码实现

public class Solution {
    public ListNode detectCycle(ListNode head) {
        boolean isfast = true;
        ListNode slow = head, fast = head;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = isfast ? fast.next.next : fast.next;
            if (slow == fast) { 
                if (isfast) { // 第一次相遇
                    isfast = false;
                    // 如果此时slow指向head,直接返回fast节点即可
                    if (slow == head) return fast; 
                    else fast = head;
                } else return fast;
            }
        }
        return null;
    }
}
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

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

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

相关文章

绚丽的流光心

快到520了&#xff0c;送大家一颗心吧。 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>body {background-color: #000;margin: 0;overflow…

国内免费版ChatGPT

目录 前言&#xff1a;网站大全 1. ChatGPT是什么 2. ChatGPT的发展历程 3. ChatGPT对程序员的影响 4. ChatGPT对普通人的影响 5. ChatGPT的不足之处 前言&#xff1a;网站大全 AI文本工具站 (laicj.cn) ——gpt-3.5 功能强大(推荐&#xff09; Chatgpt在线网页版-…

2024王道数据结构考研丨第四章:串

2024王道数据结构考研笔记专栏将持续更新&#xff0c;欢迎 点此 收藏&#xff0c;共同交流学习… 文章目录 第四章&#xff1a;串4.1串的定义和实现4.1.1串的定义4.1.2串的基本操作4.1.3串的存储结构 4.2串的模式匹配4.2.1朴素模式匹配算法4.2.2改进的模式匹配算法——KMP算法 …

【SQLServer】sqlserver数据库导入oracle

将sqlserver数据库导入到oracle 实用工具&#xff1a; SQL Server Management Studio 15.0.18424.0 SQL Server 管理对象 (SMO) 16.100.47021.07eef34a564af48c5b0cf0d617a65fd77f06c3eb1 Microsoft Analysis Services 客户端工具 15.0.19750.0 Microsoft 数据访问组件 (MDAC) …

漏洞扫描的原理

漏洞扫描是指通过自动或者手动的方式&#xff0c;对系统进行全面扫描&#xff0c;发现系统中存在的漏洞。随着互联网的发展&#xff0c;漏洞扫描的重要性越来越凸显&#xff0c;因为漏洞一旦被黑客利用&#xff0c;就可能会导致系统被攻击、数据被窃取等问题。那么什么是漏洞扫…

【实践篇】教你玩转JWT认证---从一个优惠券聊起 | 京东云技术团队

引言 最近面试过程中&#xff0c;无意中跟候选人聊到了JWT相关的东西&#xff0c;也就联想到我自己关于JWT落地过的那些项目。 关于JWT&#xff0c;可以说是分布式系统下的一个利器&#xff0c;我在我的很多项目实践中&#xff0c;认证系统的第一选择都是JWT。它的优势会让你…

shallowRef和shallowReactive的使用?

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、 shallowRef&#xff1f;二、 shallowReactive&#xff1f;在什么时候使用&#xff1f; 三、案例1、shallowRef2、shallowReactive 提示&#xff1a;以下是本篇…

为世界第一大癌症高效研发首创新药,AI大模型助力药物研发叩开未来之门

近日&#xff0c;三位高中生引爆了医药圈&#xff0c;他们使用人工智能&#xff08;AI&#xff09;引擎进行靶点发现&#xff0c;确定了多形性胶质母细胞瘤&#xff08;GBM&#xff09;的新治疗靶点&#xff0c;多形性胶质母细胞瘤&#xff08;GBM&#xff09;是最具侵袭性和最…

在外出差,如何远程登录公司内网金蝶云ERP管理系统【cpolar内网穿透】

文章目录 前言1.金蝶安装简介2. 安装cpolar内网穿透3. 创建安全隧道映射4. 在外远程访问金蝶云星空管理中心5. 固定访问地址6. 配置固定公网访问地址7.创建数据中心简介8.远程访问数据中心9. 固定远程访问数据中心地址10. 配置固定公网访问地址 转发自CSDN风浪越大%鱼越贵的文章…

微信小程序最新获取头像昵称方式

前言 版本历史变迁 一、获取头像的正确姿势 二、获取昵称的正确姿势 总结 前言 产品需要获取微信用户的昵称和头像。 这这还不简单&#xff0c;so easy&#xff01; 通过wx.getUserProfile或者 wx.getUserInfo 就可以获取到。 但是获取的昵称是”微信用户“获取的头像是…

LeetCode 515. 在每个树行中找最大值

515. 在每个树行中找最大值 描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09; 示例 示例1 输入&#xff1a;root [1,3,2,5,3,null,9] 输出&#xff1a;[1,3,9] 示例2 输入&#…

OpenHarmony dump渲染和合成图层SurfaceBuffer指南

OpenHarmony dump渲染和合成图层SurfaceBuffer指南 引言 博客停更很久了&#xff0c;提起笔来渐感生疏啊&#xff01;看来&#xff0c;还是得抽出时间来更新更新啊&#xff01;好了&#xff0c;感慨也发完了&#xff0c;是时候切入正题了。本篇博客主要以本人在实际项目的开发中…

Excel技巧之 【提取文件夹内的全部文件名】

在工作中&#xff0c;有时候需要将所有文档的名字提取出来做成表格。 这种情况&#xff0c;你是一个一个复制粘贴么&#xff1f;nonono&#xff01; 如果你是复制粘贴的&#xff0c;一定要试试下面的方法&#xff0c;可以快速提取文件名。 具体步骤&#xff1a; 1. 将所有的…

chatgpt赋能Python-python3_5怎么算

Python3|5是如何计算的&#xff1f; 介绍 Python是一种高级编程语言&#xff0c;许多开发人员喜欢使用它来构建各种应用程序&#xff0c;从网站到机器学习应用程序。然而&#xff0c;在使用Python编写代码时&#xff0c;很多人都会遇到一个问题&#xff1a;Python3|5计算是如…

粪菌移植——一种治疗人体疾病的新型疗法

谷禾健康 粪菌移植是一项近年来备受关注的医疗技术&#xff0c;它涉及将健康捐赠者的粪便物质转移至患有疾病或障碍患者的胃肠道。 简单来说就是选择健康合适的人粪便&#xff0c;通过科学方法提取出有用的微生物&#xff0c;去除有害与无用的部分&#xff0c;然后制成制剂&…

Redis缓存实战

一 Redis缓存简介 二 Redis缓存入门 在我们查询数据一般都是直接查询数据库&#xff0c;返回给前端。为了提高效率实际项目中会将基础数据等热点数据放入redis缓存中。 发起请求&#xff0c;先访问redis缓存&#xff0c;缓存中有直接将数据返回&#xff1b;缓存没有命中&…

玩转Netty,从“Hello World”开始

大家好&#xff0c;我是老三&#xff0c;之前里&#xff0c;我们讨论了Java的三种IO模型&#xff0c;提到了网络通信框架Netty&#xff0c;它简化和优化了NIO的使用&#xff0c;这期&#xff0c;我们正式开始走近Netty。 为什么要用Netty? 首先当然是NIO的使用&#xff0c;本…

知行之桥EDI系统2023版功能介绍——日志页面

在知行之桥EDI系统2023版中&#xff0c;除了在此前的文章中曾经介绍过的概览页面之外&#xff0c;还新增了日志页面。日志页面基于旧版本的状态页面进行了功能优化&#xff0c;为用户展示了消息、交易日志、应用程序日志、访问日志以及审计日志五种类型&#xff0c;每种日志类型…

MySQL 复合查询 内外连接

目录 基本查询回顾 多表查询 自连接 group by可以带多个 子查询 在from子句中使用子查询 合并查询 表的内连和外连 内连接 外连接 左外连接 右外连接 关于自连接和内连接&#xff08;chatgpt&#xff09; 基本查询回顾 查询工资高于 500 或岗位为 MANAGER 的雇员…

虚拟键盘:十六进制值和鼠标或键盘等效项。 代码按数字顺序列出

Virtual-Key Codes (Winuser.h) - Win32 apps | Microsoft Learn 虚拟键码 (Winuser.h) - Win32 apps | Microsoft Learn Value说明0x01鼠标左键0x02鼠标右键0x03控制中断处理0x04中间鼠标按钮 (三键鼠标)0x05X1 鼠标按钮0x06X2 鼠标按钮0x07Undefined0x08BACKSPACE 密钥0x09T…