JZ23 链表中环的入口结点

news/2024/4/30 11:40:37/文章来源:https://blog.csdn.net/qq_44300280/article/details/127124987

题目:
给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。

解法一:哈希表
用哈希表将访问过的节点存储起来,如果遇到重复的节点,说明就是环的入口,返回该节点即可。

public ListNode EntryNodeOfLoop(ListNode pHead) {Set<ListNode> set = new HashSet<>();while (pHead != null) {if (set.contains(pHead)) {return pHead;} else {set.add(pHead);pHead = pHead.next;}}return null;}

复杂度分析:
时间复杂度:O(n),遍历链表一次
空间复杂度:O(n),存储遍历的n个链表节点

解法二:快慢双指针
主要是数学分析,代码不难。
首先分析链表是否有环,构造快慢两个指针,快指针步幅为2,慢指针步幅为1。如果有环,则快慢指针一定会相遇,且快指针所走的路径等于慢指针所走的路径2倍,假设它们在下图中的C的相遇,相遇时快指针在环里走了n圈,慢指针在环里走了m圈,则:
快指针走的路径:x+n(y+z)+y
慢指针走的路径:x+m(y+z)+y
且存在对应关系:x+n(y+z)+y=2(x+m(y+z)+y),化简可得:x+y=(n-2m)(y+z)。x+y为从链表头部到相遇点的距离,y+z为环的长度,可得从链表头部到相遇点的距离是环的长度的整数倍。那快慢以相同的步幅,快指针从链表头开始遍历,慢指针继续在环中遍历,快慢指针最终还是会在C点相遇,因为他们步幅相同,所以其实在B点就已经相遇,然后从B点开始,快慢指针携手并进,一直在环内手拉手走到天荒地老。
在这里插入图片描述

    public ListNode EntryNodeOfLoop(ListNode pHead) {ListNode slow = hasCircle(pHead);if (slow == null) {return null;}ListNode fast = pHead;while (fast != slow) {fast = fast.next;slow = slow.next;}return fast;}private ListNode hasCircle(ListNode pHead) {if (pHead == null) {return null;}ListNode fast = pHead;ListNode slow = pHead;while (fast != null && fast.next != null) {fast = fast.next.next;slow = slow.next;if (fast == slow) {return slow;}}return null;}

先判断链表是否有环,采用步幅不同的快慢指针,若相遇则有环。
寻找环的入口,返回相遇时的节点,然后快指针从链表头开始,慢指针从相遇点开始,以相同步幅遍历,相遇点即是入口。

复杂度分析:
时间复杂度:O(n)
空间复杂度:O(1)

总结:
涉及数据结构:链表
涉及算法:快慢双指针、哈希表

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

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

相关文章

企业为什么选择SDWAN代替MPLS?

企业 SD-WAN 《夽易联》下的企业SDWAN 仅基于单个 WAN 的办公室间连接&#xff08;基于 MPLS 或 VPN&#xff09;不是动态的&#xff0c;因此无法对传输中的性能波动做出反应。新一代 SD-WAN 《夽易联》将基于 BGP 或 OSPF 的路由算法提升到一个新的水平&#xff0c;可以实时…

2022年9月总结

注&#xff1a;本文或许会让部分同学焦虑&#xff0c;写此文仅记录考研中每月的反馈&#xff0c;无任何恶意&#xff0c;纯属满足考研上岸后&#xff08;如果上岸&#xff09;的虚荣心&#xff0c;以及上岸后的一些打算做铺垫&#xff0c;无恶意&#xff01;&#xff01;&#…

ES6知识点(1)

1.let与const的特点 2.arguments与args的区别 arguments是类数组 args是数组 3.箭头函数 目的&#xff1a;简化回调函数 特性&#xff1a;this指向函数所在的作用域 补充&#xff1a; 事件绑定不要用箭头函数 箭头函数中的this指向函数所在作用域的上下文 箭头函数方法…

0062-Tui-表格示例

环境Time 2022-08-16 Rust 1.63.0 Tui 0.18.0前言 说明 参考:https://github.com/fdehau/tui-rs/blob/master/examples/table.rs 目标 使用 tui-rs 显示表格。 定义应用struct App<a> {state: TableState,items: Vec<Vec<&a str>>, }impl<a> App&…

如何使用决策树判断要不要去相亲?

大家好&#xff0c;我是王老狮&#xff0c;上一篇我们简单介绍了下什么是决策树&#xff0c;这章我们来看如何根据实际问题构建决策树&#xff0c;然后来进行决策。 1.影响决策的重要因素&#xff0c;纯度和信息熵 我们先看一组数据集&#xff1a; 我们该如何构造一个判断是否…

【XSY4765】axelavir(DP)

称序列 ⟨a1,⋯,an⟩\langle a_1,\cdots,a_n\rangle⟨a1​,⋯,an​⟩ 是避免 120 的&#xff0c;当且仅当不存在 1≤k<j<i≤n1\leq k<j<i\leq n1≤k<j<i≤n&#xff0c;满足 ai<ak<aja_i<a_k<a_jai​<ak​<aj​。 假设 a1,⋯,ai−1a_1,\c…

微信小程序 java-php大学校园学生社团系统python

功能介绍 将系统权限按管理员和学生这两类涉及学生划分。 (a) 管理员&#xff1b;管理员使用本系统涉到的功能主要有&#xff1a;个人中心、学生管理、社长管理、社团简介管理、社团招新管理、系统管理等功能 (b)学生进入系统前台可以实现首页、我的、社团简介、社团论坛等功能…

web实训大作业 网页设计期末课程设计(HTML+CSS)

&#x1f329;️ 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f482; 作者主页: 【进入主页—&#x1f680;获取更多源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;HTML5网页期末作业 (1000套…

APS排程软件帮机械加工企业解决交期承诺问题

相信很多做过生产计划的小伙伴都遇到过“交期承诺”的问题&#xff0c;实际生产中影响产品交期的因素有很多&#xff0c;进行“交期承诺”的计算不仅需要耗费大量时间&#xff0c;而且还只是估值&#xff0c;时间不准确&#xff0c;同时交期承诺影响订单交付&#xff0c;还影响…

大型企业——伙伴云,为什么会选择Baklib帮助中心?

当前产品的帮助中心不再只是为用户解决问题而存在&#xff0c;而更像是一个产品团队与用户进行交流的地方&#xff0c;你可以在这里介绍你的公司和产品&#xff0c;宣传你的理念&#xff0c;引导用户体验主打的功能&#xff0c;解答用户的问题&#xff0c;了解用户当前使用中遇…

P21升级后,用旧的spec模板生成的defime.xml中WhereClauses(VLM)里的逗号不能正常显示

背景&#xff1a;有个项目在P21升级之前&#xff08;v3.1.2&#xff09;做过一版defime.xml。后期因为某种原因导致数据集变更&#xff0c;同时define也需要重新生成。所以只能使用升级后的P21&#xff08;v4.0.1&#xff09;软件生成defime.xml。两次生成defime.xml使用的都是…

win10 安装Elasticsearch 安装 Kibana

1 下载 Elasticsearch &#xff08;ES需要有JDK环境&#xff0c;自行安装&#xff09; 官网 Download Elasticsearch | Elastic 这里下载的 8.4.2 Es 版本必须与 Kibana 版本对应 2 解压 打开 config 目录 3 找到 elasticsearch.yml 配置文件 4 修改 elasticsea…

JAVA中如何实现代码优化

1.用String.format拼接字符串 例&#xff1a;比如现在有个需求&#xff1a;要用get请求调用第三方接口&#xff0c;url后需要拼接多个参数。 1&#xff09; 以前我们的请求地址是这样拼接的&#xff1a;字符串使用号拼接&#xff0c;非常容易出错。 String url "http://…

Linux安全之SELinux理解

安全增强式 Linux&#xff0c;即SELinux(Security-Enhanced Linux)是一个 Linux 内核的安全模块&#xff0c;其提供了访问控制安全策略机制&#xff0c;包括了强制访问控制(Mandatory Access Control&#xff0c;MAC)。SELinux 是一组内核修改和用户空间工具&#xff0c;已经被…

0052-Tui-设置方块样式

环境Time 2022-08-09 Rust 1.62.0 Tui 0.18.0前言 说明 参考:https://github.com/fdehau/tui-rs/blob/master/examples/block.rs 目标 使用 tui-rs 对方块设置各种不同的样式。 设置背景色 let block = widgets::Block::default().title("设置背景色").style(style:…

跨境电商如何利用WhatsApp API交互式按钮提高客户转化率

WhatsApp API有很多实用的功能&#xff0c;跨境电商卖家因此可以为客户提供出色的客户服务体验与服务。 跨境电商卖家在通过WhatsApp API为客户提供服务或进行营销时&#xff0c;交互性功能可以明显提高客户转化率。因为当用户想要选择服务或产品时&#xff0c;可以直接使用交…

Java / Tensorflow - API 调用 pb 模型使用 GPU 推理

目录 一.引言 二.Java / Tensorflow 代码配置 1.代码配置 2.Maven 配置 三.环境检测 1.显卡检测 2.显卡监控 四.推理踩坑 1.异常现象 2.异常日志 五.安装 cuda-10.0 1.下载 cuda 安装包 2.安装 cuda 2.1 preface 前言 2.2 安装配置 2.3 安装完成 2.4 可能遇到的…

day013--mysql中的子查询

目录 一&#xff0c;前言 二&#xff0c;子查询的定义及书写格式 1&#xff0c;定义 2&#xff0c;书写格式 三&#xff0c;子查询的分类 1&#xff0c;单行子查询和多行子查询 2&#xff0c;相关子查询和非相关子查询 一&#xff0c;前言 相信大家还记得之前我们在学习分…

保研专业课参考

文章目录数据结构1.什么是平衡树&#xff1f;平衡树是怎么创建的&#xff1f;2.二叉排序树的性质&#xff1a;3.如何编程判断一棵二叉树是完全二叉树4.二叉树怎么求高度&#xff08;山大计算机&#xff09;5.在图中找到一个连通图&#xff0c;有n个顶点&#xff0c;n-1条边使得…

SQL Server大分区表没有空分区的情况下如何扩展分区的方法

官方文档https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-partition-function-transact-sql?viewsql-server-ver16 Best Practices Always keep empty partitions at both ends of the partition range. Keep the partitions at both ends to guarantee that th…