LeetCode142:环形链表II

news2025/6/22 13:54:02

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

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

不允许修改 链表。

示例 1:
在这里插入图片描述

输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
在这里插入图片描述

输入:head = [1,2], pos = 0
输出:返回索引为 0 的链表节点
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
在这里插入图片描述

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

链表中节点的数目范围在范围 [0, 104] 内
-105 <= Node.val <= 105
pos 的值为 -1 或者链表中的一个有效索引
进阶:你是否可以使用 O(1) 空间解决此题?

Related Topics
哈希表
链表
双指针

1. 双指针

  1. 定义两个指针 fast 与 slow。初始时,都位于链表的头部 head。slow 指针每次向后移动一个位置,而 fast 指针向后移动两个位置。如果链表中存在环,则 fast 指针最终将与 slow 指针在环中相遇。

  2. 假设列表长度为l,环外部分的长度为a;在环内部按顺时针方向走,环起点位置到相遇位置的长度为b,相遇位置到环起点位置的长度为c,则 l = a + b + c。

  3. 相遇时,slow 指针走过的距离为一个a和一个b(slow 指针走过的距离不会超过链表的总长度才与 fast 指针相遇,所以是一个b),即 a + b;fast 指针走过的距离是一个a、n个(b + c)和一个b,即a + n(b + c) + b。

  4. 因为 fast 的速度是 slow 的 2 倍,所以有a + n(b + c) + b = 2(a + b),变形后有 a = (n-1)(b+c) + c,从这个等式可以看出,从链表头节点到环起点的距离 a,等于相遇点到环起点的距离 c 加上 n-1 圈环(a + b)的长度。

  5. 因此,在相遇后,可以让 slow 指针回到链表头节点,fast 指针位置不变,然后使 slow 和 fast 指针都每次只移动一个位置,当slow 和 fast 相等时,就是环的起点。

/**
 * 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) {
        if (head == null) {
            return null;
        }
        boolean flag = false;
        ListNode slowPtr = head, fastPtr = head;
        while (fastPtr.next != null && fastPtr.next.next != null) {
            slowPtr = slowPtr.next;
            fastPtr = fastPtr.next.next;
            if (slowPtr == fastPtr) {
                flag = true;
                break;
            }
        }
        if (flag) {
            slowPtr = head;
            while (slowPtr != fastPtr) {
                fastPtr = fastPtr.next;
                slowPtr = slowPtr.next;
            }
            return slowPtr;
        }
        return null;
    }

}
  • 复杂度分析
    时间复杂度:O(N),其中 N 为链表中节点的数目。在判断链表是否存在环时,slow 指针走过的距离不会超过链表的总长度;随后寻找环起点位置时,走过的距离也不会超过链表的总长度。因此,总的执行时间为 O(N)+O(N)=O(N)。
    空间复杂度:O(1)。只使用了 slow,fast 两个指针。

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

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

相关文章

前端--CSS

文章目录 CSS的介绍 引入方式 代码风格 选择器 复合选择器 (选学) 常用元素属性 背景属性 圆角矩形 Chrome 调试工具 -- 查看 CSS 属性 元素的显示模式 盒模型 弹性布局 一、CSS的介绍 层叠样式表 (Cascading Style Sheets). CSS 能够对网页中元素位置的排版进行像素级精…

针对网贷诈骗网站渗透1

开局一张图 二.漏洞分析 2.1 第一套源码漏洞分析 2.1.1 Thinkphp日志泄漏 基于Thinkphp3.2.3开发&#xff0c;前后台分离 默认开启Debug、导致泄漏日志SQL信息、异常缓存 构造Payload&#xff1a;App/Runtime/Logs/21_10_16.log 获取泄漏的admin表账号密码 进入后台 2.1.2 数组…

Docker安装、启动、管理ElasticSearch、ElasticSearch-heade、kibana

一、ElasticSearch 1.1.镜像拉取 docker pull elasticsearch:7.17.13 1.2.启动 docker run -d --name "容器名称" -e "ES_JAVA_OPTS-Xms512m -Xmx512m" -p 9200:9200 -p 9300:9300 elasticsearch:7.17.13启动后使用docker logs查看ES启动日志&#xf…

地表水与地下水耦合模拟

耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果&#xff0c;SWAT作为一个地表水模型可以较好的模拟主要的水文过程&#xff0c;包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等&#xff0c;但是对于地下水部分的模拟相对粗糙&#xff0c;考虑到SWAT…

攻防世界题目练习——Web引导模式(二)

题目目录 1. Web_php_unserialize2. supersqli3. web24. NewsCenter5. Web_python_template_injection6. catcat-new 1. Web_php_unserialize 题目源码&#xff1a; <?php class Demo { private $file index.php;public function __construct($file) { $this->file …

can not remove .unionfs

文件夹下出现unionfs 套娃&#xff0c;无法删除。 处理方式&#xff1a; 需要管理员权限umount之后删除使用fusermount -zu .unionfs &#xff0c;然后再删除。

网络安全(黑客技术)—自学手册

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

STM32 CubeMX ADC采集 单通道,多通道,内部温度(轮询,DMA,中断)(HAL库)

STM32 CubeMX ADC采集&#xff08;HAL库&#xff09; STM32 CubeMX STM32 CubeMX ADC采集&#xff08;HAL库&#xff09;ADC介绍ADC主要特征Vref的电压&#xff08;2.4~3.6&#xff09;就是ADC参考电压2.4V&#xff08;相当于秤砣&#xff09; 最小识别电压值&#xff1a;2.4/4…

从毕业到创业,普通人如何“逆袭”?

都说当代年轻人在上班和上进之间&#xff0c;选择了上香。尽管如此&#xff0c;仍有人19岁便完成“45天净赚4万”的目标&#xff0c;也有人仅凭两人之力便成功做到“14天推广5000人”。而这些数字的“创造者”&#xff0c;正是龚祖宋。 从求学到求职&#xff0c;年轻人总是面临…

常用的语音芯片工作原理_分类为语音播报 语音识别 语音合成tts

1.0 语音芯片分类-语音播报-语音识别-语音合成 关于声音的需求&#xff0c;从始至终&#xff0c;都是很刚需的需求 。从语音芯片的演化就能看出很多的端倪&#xff0c;很多很多的产品他必须要有语音&#xff0c;才能实现更好的交互。而语音芯片的需求分类&#xff0c;其实也是很…

香港高才通申请详细步骤

去年与同学聊天&#xff0c;同学建议我申请香港优才&#xff0c;说是对孩子以后考学有好处&#xff0c;我家孩子现在还可以赶得上&#xff0c;当时查了一下&#xff0c;但是没有查到具体的就放下忙工作去了&#xff0c;今年刚好公司在宣讲海外留学服务的增值服务时&#xff0c;…

ESD门禁闸机的应用和功能说明

ESD门禁闸机是一种用于控制人员出入的安全设备&#xff0c;具有以下应用和功能说明&#xff1a; 应用&#xff1a; 工厂、企业、学校等单位的门禁控制&#xff1b; 公共场所的出入管理&#xff0c;如机场、地铁站、商场等&#xff1b; 医院、实验室等场所对人员出入的管理和…

Python【控制台输出案例】

要求&#xff1a;在控制台上上输入如下案例 *********** *********** *********** 代码1如下&#xff1a; layer int(input("请输入你要打印的行数&#xff1a;")) index 1 while index < layer:print("*"*10)index 1 ps:为了确保index 1语句在循…

vue+element实现电商商城礼品代发网,商品、订单管理

一、项目效果图 1.首页 2.登录 版本2&#xff1a; 3.注册 4.找回密码 5.立即下单 6.商品详情 7.个人中心-工作台 8.个人中心-订单列表 9.订单中心-包裹列表 10.个人中心-工单管理 11.我的钱包 12.实名认证 13.升级vip 14.个人中心-推广赚钱 二、关键源码 1.路由配置 impor…

数据治理的数字画像

随着全网步入大数据时代&#xff0c;企业的目光日益聚焦在利用大数据服务精细化营销、精细化运营上&#xff0c;各类客户画像、员工画像理论如雨后春笋般兴起&#xff0c;而数据应用的底层——数据治理&#xff0c;却鲜有整体的理论体系。如何避免治理工作自身“无的放矢”&…

泛微E8 查询分部总部部门信息

当查询泛微 OA 部门&#xff0c;请使用 HrmDepartment 表&#xff1b;当查询分部信息&#xff0c;请使用 HrmSubCompany 表。当查询总部信息&#xff0c;请使用 HrmCompany 表。 其中&#xff0c;总部信息通过总部 id - 分部 companyid 进行关联&#xff1b;分部信息通过分部 …

在这个砸钱推广都效果甚微的时代,你该如何突出重围

有市场就有竞争&#xff0c;有竞争就有优胜劣汰&#xff0c;不做引领就会被遗忘&#xff0c;近几年&#xff0c;“数字化”、“智能化”一直是业内热议的话题&#xff0c;数据驱动的营销模式是未来市场显著的特征,运营商大数据在营销领域能帮助企业提升销售效率,降低企业获客成…

URL because the SSL module is not available

Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host‘pypi.org’, port443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError(“Can’t connect to HTT PS URL because the…

软件TFN 2K的分布式拒绝攻击(DDos)实战详解

写在前头 本人写这篇博客的目的&#xff0c;并不是我想成为黑客或者鼓励大家做损坏任何人安全和利益的事情。因科研需要&#xff0c;我学习软件TFN 2K的分布式拒绝攻击&#xff0c;只是分享自己的学习过程和经历&#xff0c;有助于大家更好的关注到网络安全及网络维护上。 需要…

微信小程序/vue3/uview-plus form兜底校验

效果图 代码 <template><u-form :model"form" ref"formRole" :rules"rules"><u-form-item prop"nickname"><u-input v-model"form.nickname" placeholder"姓名" border"none" /&…