【LeetCode 算法】Linked List Cycle II 环形链表 II

文章目录

Linked List Cycle II 环形链表 II

问题描述:

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

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

不允许修改 链表。

链表中节点的数目范围是 [ 0 , 1 0 4 ] − 1 0 5 < = N o d e . v a l < = 1 0 5 p o s 为 − 1 或者链表中的一个有效索引 链表中节点的数目范围是 [0, 10^4]\\ -10^5 <= Node.val <= 10^5\\ pos 为 -1 或者链表中的一个 有效索引 链表中节点的数目范围是[0,104]105<=Node.val<=105pos1或者链表中的一个有效索引

分析

和昨天的环形链表类似,利用哈希可以在 O ( N ) O(N) O(N)的时间下,找到第一个节点。

另一种就是空间为常数快慢指针,就是昨天发的那个,它还有个比较学术的名字,Floyd判圈算法(Floyd Cycle Detection Algorithm),它的应用场景很广泛,可以自行Bing,Google。

它的思路比较简单,如果存在环,那么先找到快慢指针在环中的相遇的点 x,然后再让2个指针分别从head,x出发,直到2者相遇,就是环的入口点

思路很简单,但是大部分人还是不一定能AC。

为什么按照这个思路,可以找到的点一定是入口点?

讨论的前提是有环。

假设入口点是y,那么从 h e a d head head到达y需要 a步,从y到达2指针的相遇点x要走b步,b一定是小于n的,从x继续走c步到达入口y,所以环的大小 b + c b+c b+c
f a s t 走的路程 = a + ( k + 1 ) ( b + c ) + b fast 走的路程 = a+ (k+1)(b+c) + b fast走的路程=a+(k+1)(b+c)+b。 a 是无环段,b是环的入口到x的路程,而 ( k + 1 ) ( b + c ) (k+1)(b+c) (k+1)(b+c) 就是跑环的圈数 k > = 0 k>=0 k>=0
s l o w 的路程 = a + b slow的路程 = a+b slow的路程=a+b ,因为fast的速度是slow的2倍,所以路程也是其2倍,即
a + b + ( k + 1 ) ( b + c ) = 2 ∗ ( a + b ) ( k + 1 ) ( b + c ) = a + b k ( b + c ) + c = a a+b +(k+1)(b+c) = 2*(a+b)\\ (k+1)(b+c) = a+b\\ k(b+c)+c = a a+b+(k+1)(b+c)=2(a+b)(k+1)(b+c)=a+bk(b+c)+c=a

到这里就会可以得到一个结论,设置2个指针分别从点x和head出发,每次一步,如果相遇就是入口点

如果你无法理解这个结论.

提示你可以从路程的角度来思考,即一个从x出发的指针,它可能走c,或者是k(b+c)+c,然后恰好与另一个指针在入口相遇。

时间复杂度 O ( N ) 时间复杂度O(N) 时间复杂度O(N)

空间复杂度 O ( 1 ) 空间复杂度O(1) 空间复杂度O(1)

代码

哈希

public boolean hasCycle(ListNode head) {Set<ListNode> set = new HashSet();ListNode p = head;while(p!=null){if(!set.add(p)) return p;p = p.next;}return null;} 

时间复杂度 O ( N ) O(N) O(N)

空间复杂度 O ( N ) O(N) O(N)

快慢指针

public ListNode detectCycle(ListNode head) {if(head==null||head.next==null) return null;        ListNode vh = new ListNode(-1);vh.next = head;ListNode f = vh, s = vh;while(f!=null&&f.next!=null){ f = f.next.next;s = s.next;if(f==s) break;} if(f==null||f.next==null) return null;ListNode p = vh, q = f;while(p!=q){p = p.next;q = q.next;}return q;}

时间复杂度 O ( N ) O(N) O(N)

空间复杂度 O ( 1 ) O(1) O(1)

Tag

LinkedList

Hash

Two Pointers

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

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

相关文章

FPGA实现NIC 10G UDP协议栈网卡,纯verilog代码编写,提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、10G网卡基本性能简介4、详细设计方案接口概述PCIe HIPDMA IFAXI总线接口时钟同步处理TXQ和RXQ队列TXCQ和RXCQ队列完成EQ MAC PHY流水线队列管理发送调度程序端口和接口数据路径以及发送和接收引擎分段内存接口 5、vivado工程详解6、上板…

Vue教程(三):计算属性

1、姓名案例—插值语法版 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>姓名案例-插值语法版</title><script type"text/javascript" src"../js/vue.js"><…

【Docker】制作Docker私有仓库

文章目录 1. 安装私有镜像仓库2. 镜像仓库可视化3. 参考资料 1. 安装私有镜像仓库 由于之后我们需要推送到私有镜像仓库&#xff0c;我们预先安装好&#xff0c;使用的是Docker公司开发的私有镜像仓库Registry。 下载Registry的Docker镜像&#xff1b; docker pull registry:2使…

极验4代滑块验证码破解(补环境直接强暴式拿下)

目录 前言一、分析二、验证总结借鉴 前言 极验第四代好像简单了特别多&#xff0c;没有什么技巧&#xff0c;环境党直接5分钟拿下。 网址: aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vYWRhcHRpdmUtY2FwdGNoYS1kZW1v 一、分析 直接去它官网&#xff0c;滑动滑块打开控制台瞅瞅 可以看…

Spring Boot 3.x 系列【49】启动流程 | 创建、准备应用上下文

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.1.0 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 文章目录 1. 前言2. 核心类2.1 ServletWebServerApplicationContext2.2 AnnotatedBeanDefinitionReader ClassPathBeanDefinitionSc…

CSS中有哪些单位?

CSS中有多种单位可用于指定尺寸、长度、角度等值。 下面是一些常见的CSS单位&#xff1a; 1. px (pixels)&#xff1a;像素单位&#xff0c;是相对于屏幕上的单个像素点的长度单位。 2. % (percentage)&#xff1a;百分比单位&#xff0c;相对于父元素的特定属性的值进行计算…

day18-二叉树统一迭代写法

二叉树统一迭代写法 思路 前面说了&#xff0c;前序/后序和中序不能统一的原因是因为&#xff0c;访问和处理的时机不同&#xff0c;如果要做到同时处理&#xff0c;我们可以在要处理的结点后放一个空指针作为标记。如下 前序代码&#xff1a; class Solution { public:vec…

【Leetcode】69.x的平方根

一、题目 1、题目描述 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 示例1: 输入:x = 4 输出:2示例2: 输入:…

Maven pom.xml文件中build,plugin标签的具体使用

<build> 标签 <build> 标签是 pom.xml 文件中一个重要的标签&#xff0c;用于配置 Maven 项目的构建过程。在 <build> 标签下&#xff0c;可以配置构建相关的设置&#xff0c;包括源代码目录、输出目录、插件配置等。 以下是 <build> 标签的详细使用方…

数学建模学习(8):单目标和多目标规划

优化问题描述 优化 优化算法是指在满足一定条件下,在众多方案中或者参数中最优方案,或者参数值,以使得某个或者多个功能指标达到最优,或使得系统的某些性能指标达到最大值或者最小值 线性规划 线性规划是指目标函数和约束都是线性的情况 [x,fval]linprog(f,A,b,Aeq,Beq,LB,U…

MyBatis缓存-提高检索效率的利器--二级缓存

文章目录 缓存-提高检索效率的利器缓存-官方文档二级缓存基本介绍二级缓存原理图 二级缓存快速入门快速入门注意事项和使用陷阱理解二级缓存策略的参数 四大策略如何禁用二级缓存mybatis 刷新二级缓存的设置 缓存-提高检索效率的利器 缓存-官方文档 文档地址: https://mybati…

秋叶整合包如何安装Python包

前几天写了一篇《手把手教你在本机安装Stable Diffusion秋叶整合包》的文章&#xff0c;有同学运行时遇到缺少Python Module的问题&#xff0c;帮助他处理了一下&#xff0c;今天把这个经验分享给大家&#xff0c;希望能帮助到更多的同学。 有时候启动某些插件的时候会出现 Mo…

【单机多卡】torch改造代码为DDP单机多卡分布式并行

torch分布式数据并行DDPtorch.nn.parallel.DistributedDataParallel代码修改记录。&#xff08;要求pytorch_version>1.0&#xff09; 目录 1.&#x1f344;&#x1f344;要修改的地方概览 2.✏️✏️初始化 3.✏️✏️设置当前进程GPU 4.✏️✏️设置sampler 5.✏️✏…

【设计模式】简单工厂模式

C语言实现简单的工厂模式 #include <stdio.h> #include <stdlib.h>// 图形类型枚举 typedef enum {CIRCLE,SQUARE,RECTANGLE } ShapeType;// 图形结构体 typedef struct {ShapeType type;float area; } Shape;// 创建圆形 Shape* createCircle() {Shape* circle …

大数据开发面试必问:Hive调优技巧系列一

Hive必问调优 Hive 调优拆解:Hive SQL 几乎是每一位互联网分析师的必备技能&#xff0c;相信很多小伙伴都有被面试官问到 Hive 优化问题的经历。所以掌握扎实的 HQL 基础尤为重要&#xff0c;hive优化也是小伙伴应该掌握的一项技能&#xff0c;本篇文章具体从hive建表优化、HQ…

数据结构-链表结构-单向链表

链表结构 说到链表结构就不得不提起数据结构&#xff0c;什么是数据结构&#xff1f;就是用来组织和存储数据的某种结构。那么到底是某种结构呢&#xff1f; 数据结构分为&#xff1a; 线性结构 数组&#xff0c;链表&#xff0c;栈&#xff0c;队列 树形结构 二叉树&#x…

QWidget窗口类

QWidget窗口类 设置父对象窗口位置窗口尺寸窗口标题和图标信号槽函数例子1例子3例子3 设置父对象 // 构造函数 QWidget::QWidget(QWidget *parent nullptr, Qt::WindowFlags f Qt::WindowFlags());// 公共成员函数 // 给当前窗口设置父对象 void QWidget::setParent(QWidget…

Linux系统下MySQL读写分离

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、基于Amoeba读写分离 1.基于程序代码内部实现 2.基于中间代理层实现 三、操作步骤 1.在主机Amoeba上安装java环境 2.安装并配置Amoeba 3.配置Amoeba读写分离…

【大数据趋势】7月30日 汇率,恒指期货的大数据趋势概率分析。

1. 数据源头之一 : 汇率变化 从程序模拟趋势来看&#xff0c;美元在持续弱势状态&#xff0c;周线上正在构建一个新的下跌趋势&#xff0c;而且正在反抽过程中&#xff0c;即将完成&#xff0c;如果没有外部干预&#xff0c;会顺势往下。从月线来看&#xff0c;高点逐步降低&a…

没有 telnet 不能测试端口?容器化部署最佳的端口测试方式

写在前面 生产中遇到&#xff0c;整理笔记在容器中没有 telnet &#xff0c;如何测试远程端口理解不足小伙伴帮忙指正 他的一生告诉我们&#xff0c;不能自爱就不能爱人&#xff0c;憎恨自己也必憎恨他人&#xff0c;最后也会像可恶的自私一样&#xff0c;使人变得极度孤独和悲…