leetcode.环形链表问题

目录

题目1

示例

解题思路

代码实现

补充

题目2

示例

解题思路

代码实现


题目1

66360b0d1ac6496e9f4195ae0fb6a0e0.jpg

该题链接:https://leetcode.cn/problems/linked-list-cycle/description/

示例

ff1e1d3a4c744212b2a3814f99f6165f.png

cd707a3f7848435781f3138a894e2e3c.png

解题思路

     要创建两个指针一个是快指针(fast),另一个慢指针(slow)。快指针走两步慢指针走一步,让它们一起往后走,如果它们相等即存在环。

     为什么它们相等即存在环呢?

     我们先假设一个链表存在环。让fast和slow一起从起始位置走。fast肯定先进环。当slow走到环的入口处时,假设fast与slow的距离为N。fast走两步,slow走一步,这时N会变成N-1。只要它们一直走,N一定会等于零,这时候它们相遇,即存在环。

代码实现

     这里着重讲一下循环结束条件。

  • 如果没有环,因为fast走的快所以它会先遇到NULL。要另外加上fast->next这是为了防止对NULL进行解应用。
  • 如果有环直接返回即可。
typedef struct ListNode ListNode;
bool hasCycle(struct ListNode *head) {
    ListNode* slow = head,*fast = head;
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast)
            return true;
    }
    return false;
}

补充

     为什么快指针要走两步走三步不行吗?四步呢?n步呢?这里我介绍fast走三步的情况。

     假设环的总长度为C。根据上面我介绍的如果N为奇数第一轮它们不会相遇。第二轮它们的距离是C-1,如果C-1是奇数那它们就永远就遇不到了。

总结一下:

     1、N是偶数,第一轮就追上了

     2、N是奇数,第一轮追击会错过,距离变成C-1

          a、如果C-1是偶数,下一轮就追上了

          b、如果C-1是奇数 那么就永远追不上 

     同时存在N是奇数且C是偶数,那就永远追不上

     让我们来证一下

     假设现在slow现在在入环口。设slow走的距离为L ,fast走的距离为L+X*C+C-N(X是fast在环里转的圈数)。

6f3f80a72536484e86433e6cd0db284f.png

     因为3slow=fast。所以3L=L+X*C+C-N。化简得2L=(X+1)C-N。

     分析:2L为偶数,将上面的不存在条件带入会发现该等式并不成立,所以走三步会遇到。

题目2

该题链接:https://leetcode.cn/problems/linked-list-cycle-ii/description/ 

示例

解题思路

     先设个快慢指针如果存在环则它们一定会相遇,当它们相遇时设一个meet指针指向它们相遇位置,在设一个head指针指向链表头节点。让它们同时走每次走一步,当它们相等时即找到入环的节点。

     解释:假设从头结点到入环节点距离为L,入环节点到fast和slow的相遇点距离为N。

      fast走的距离L+X*C+N(X是圈数),slow走的距离L+N。因为2slow=fast得

      2(L+N)=L+X*C+N,化简得:L=(X-1)C+C-N。即L=C-N。

代码实现

typedef struct ListNode ListNode;
struct ListNode *detectCycle(struct ListNode *head) {
    ListNode* slow = head, *fast = head;
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast)
        {
            ListNode* meet = slow;
            while(meet != head)
            {
                meet = meet->next;
                head = head->next;
            }
            return meet;
        }
    }
    return NULL;
}

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

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

相关文章

网络安全快速入门(十二)(下) 目录结构相关命令补充

12.4 补充命令 我们已经了解了linux的目录结构,接下来我们大概看一下针对目录及文件的一些相关命令, 我们本章只讲三个目录及文件相关的命令,分别是tree,find及校验文件命令,我们一个一个来看这些命令。 12.4.1 tree命…

MySQL 编译安装

一、数据库的基本概念 数据(Data) 数据库中存储的实际信息,可以是数字、文本、图像等形式。 表 以行和列的形式结构化存储数据。 数据库 表的集合,存放数据的仓库 数据库 ——> 数据表 ——> 数据 数据库管理系统&…

【OceanBase诊断调优】—— 备份恢复如何定位 NFS 服务异常

当备份、归档出现异常时,我们应该首先排除备份介质、网络是否正常,本文讲述如何通过系统表和日志来定位 NFS 服务异常。 适用版本 OceanBase 数据库所有版本。 如何查看备份归档异常? 查看备份归档状态表,MAX_NEXT_TIME 应与当…

Adaboost集成学习 | Matlab实现基于CNN-BiLSTM-Adaboost集成学习时间序列预测(股票价格预测)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Adaboost集成学习 | Matlab实现基于CNN-BiLSTM-Adaboost集成学习时间序列预测(股票价格预测) 模型设计 融合Adaboost的CNN-BiLSTM模型的时间序列预测,下面是一个基本的框架。 数据准备: 收集并整理用于时…

MVP产品设计与数据指标

MVP(minimum viable product,最小化可行产品)概念最早由埃里克莱斯提出,刊载于哈弗商业评论,并有出版物《精益创业》 和常规产品不同,MVP更侧重于对未知市场的勘测,用最小的代价接触客户的方法…

5.14_练习

1、字符串逆序 编写一个函数reverse_string(char* string)(递归实现) 实现:将参数字符串中的字符反向排列,不是逆序打印 要求:不能使用C函数库中的字符串操作函数 比如: char arr[ ]"abcdef"; 逆序之后数组的内容…

Vue的学习 —— <vue事件处理>

前言 事件指的就是用户和网页交互的行为,这些行为,包括:鼠标单击、鼠标双击、键盘按下、抬起等。为了简化开发,Vue为开发者提供了事件修饰符,它可以与v-on配合使用,以便于对事件进行控制和处理&#xff0c…

最新的GPT4o文档解析能力实测

5.13日,openAI发布了最新的GPT模型-GPT4o,发布会虽短,但是带来的模型却提升很大,速度更快,推理能力更强,tokens更↓ 下面简单测一下他的文档解析能力如何: 1.我们使用国内某官方直连站&#xff…

momentjs

Moment.js 是一个用于处理日期和时间的 JavaScript 库,它提供了许多方便的函数和方法来操作、格式化和解析日期时间。官网 常见用法 格式化日期时间:可以使用format方法将日期时间格式化为指定的字符串格式,例如YYYY-MM-DD HH:mm:ss。获取日…

免费申请https证书

免费申请https证书 https域名证书对提高网站排名有一定的好处,所以当今很多企业为了给网站一个好的安全防护,就会去申请该证书。如今很多企业虽然重视网站的安全防护,但是也重视成本,所以为了节约成本会考虑申请免费的https证书。…

搭建Rust开发环境

Windows搭建 下载:https://www.rust-lang.org/zh-CN/tools/install Linux搭建 这里我更推荐基于Linux搭建。 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh等一会儿以后,会让你输入命令,这里输入1: 之后就…

【源码】2024全新多语言区块链交易所源码/期权交易/申购/币币秒合约交易所

全新ui,更新很多内容,具体看图,全部开源 全新多语言区块链交易所源码/期权交易/申购/币币秒合约交易所 - 吾爱资源网

LeetCode算法题:128. 最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入:nums [100,4,200,1,3,2] 输出:4 …

3、用Vue快雕塑搭建一个管理系统的页面布局框架

3.2.顶部栏header 在el-header标签里对标签栏header进行样式定义 <template><div id"app"><el-container><el-header style"background-color: #4c535a"><img src"/assets/logo.png" alt"" style"w…

卷积网络项目:实现识别鲜花四分类对比LeNet5、VGG16、ResNet18、ResNet34分类网络

卷积四分类项目 Gitee传送门 分类目标选取 鲜花 杏花 apricot_blossom桃花 peach_blossom梨花 pear_blossom梅花 plum_blossom 模型选择 卷积 LeNet5VGG16ResNet18ResNet34 以图搜图 获取相似度前10的搜图结果 数据清洗 鲜花四分类 删除非图片文件 删除重复图片 整理…

FlyFlow:支持驳回后自动跨节点跳回

本周更新 新增&#xff1a;审批节点驳回&#xff08;拒绝配置的驳回&#xff09;支持自动跳回当前节点新增&#xff1a;修改数据节点新增&#xff1a;删除数据节点新增&#xff1a;子流程支持配置自动跳过发起人节点优化&#xff1a;两个项目合并一个单体项目优化&#xff1a;…

Springboot3 链接Redis遇到的报错(本文仅记录保存,优质文章移步springboot专栏)

出现的报错&#xff1a; cannot connect to Redisedis.clients.jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is setredis wrong number of arguments for ‘auth’ command 其实上面的三个报错是不同界面显示的&#xff0c;后面两个是通过Ide…

BA112网关实现BACnet楼宇系统与OPC UA平台高效协同钡铼技术

在现代智能建筑领域&#xff0c;楼宇自动化控制系统&#xff08;BAS&#xff09;的高效运作是实现节能减排、提升居住与工作环境舒适度、增强设施管理效率的关键。BACnet协议作为楼宇自动化领域的国际标准&#xff0c;广泛应用于暖通空调、照明控制、安防系统等多个方面。然而&…

信创FTP替代的方案中,哪一个才是最适合航空行业的?

2018年以来&#xff0c;受“华为、中兴事件”影响&#xff0c;我国科技尤其是上游核心技术受制于人的现状对我 国经济发展提出了严峻考验。在全球产业从工业经济向数字经济升级的关键时期&#xff0c;中国明确 “数字中国”建设战略&#xff0c; 抢占数字经济产业链制高点。 在…

Spring AOP(概念,使用)

目录 Spring AOPAOP是什么什么是Spring AOPAOP实际开发流程1. 引入依赖2. 编写AOP程序 Spring AOP详解Spring AOP中的核心概念Spring AOP的通知类型六种类型PointCutOrder(切面优先级) Spring AOP AOP是什么 Aspect Oriented Programminig(面向切面编程)切面指的是某一类特定…