LeetCode 142.环形链表2 C写法

LeetCOde 142.环形链表2 C写法

image-20240713164828368

思路1🤔:

​ 用环形链表的方法,快慢指针找到slow和fast的相遇点,此时头到入口点的位置相遇点到入口点距离一样

​ 我们假设头到入口点的长度为L,环的长度为C,相遇点到入口点的长度为X。那么我们可以计算出在相遇时,fast走了L+n*C+X步(其中n为fast走的圈数),slow走了L+X步,且fast步数是slow的两倍,进一步得出等式 2(L+X) = L+n*C+X,化简后得到L = n*C -X,然而n无论走多少圈,最后还是在相遇点,所以可以把n看做1,最后得L = C - XC-X就是相遇点到入口点的长度,等式成立,推出该方法。

image-20240713171335568

代码🔎:

struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* slow = head;struct ListNode* fast = head;while(fast && fast->next){fast = fast->next->next;slow = slow->next;if(slow == fast) //带环则开始找入口点{struct ListNode* meet = slow;while(meet != head) //meet等于head时代表找到入口点{meet = meet->next;head = head->next;}return meet;}}return NULL;
}

image-20240713171718872

思路2🤔:

​ 在相遇点用一个指针meet等于slow,meet再找到meet的next,然后将slow->next指向空,那么下一次循环的时候就会在空结点停下,将环形链表变为相交链表。

image-20240713173339858

代码🔎:

struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* slow = head;struct ListNode* fast = head;while(fast && fast->next){fast = fast->next->next;slow = slow->next;if(slow == fast){struct ListNode* meet = slow;meet = meet->next; slow->next = NULL; //断环struct ListNode* List1 = head;struct ListNode* List2 = meet;int LenHead = 1;int LenMeet = 1;int gap = 0;while(List1->next) //计算走到尾需要多少步{++LenHead;List1 = List1->next;}while(List2->next){++LenMeet;List2 = List2->next;}if(List1 == List2) //这里可以不写,因为有相遇点必定是相交链表{struct ListNode* shortList = head; //先假设头结点到入口点的长度更短struct ListNode* longList = meet;gap = abs(LenHead-LenMeet); //更长的的先走gap步if(LenHead > LenMeet) //如果假设错了就交换{shortList = meet;longList = head;}while(gap--) //让长短链表距离相等{longList = longList->next;}while(longList != shortList) //相等就说明找到入口点{longList = longList->next;shortList = shortList->next;}return longList;}}}return NULL;
}

image-20240713175013987

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

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

相关文章

Rust 测试的组织结构

测试的组织结构 本章一开始就提到,测试是一个复杂的概念,而且不同的开发者也采用不同的技术和组织。Rust 社区倾向于根据测试的两个主要分类来考虑问题:单元测试(unit tests)与 集成测试(integration test…

负荷预测 | Matlab基于Transformer-LSTM多变量时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于Transformer-LSTM多变量时间序列多步预测; 2.多变量时间序列数据集(负荷数据集),采用前96*2个时刻预测的特征和负荷数据预测未来96个时刻的负荷数据&#x…

记一次饱经挫折的阿里云ROS部署经历

前言 最近在参加的几个项目测评里,我发现**“一键部署”这功能真心好用,省下了不少宝贵时间和力气,再加上看到阿里云现在有个开源上云**的活动。趁着这波热潮,今天就聊聊怎么从头开始,一步步搞定阿里云的资源编排服务…

【持续集成_06课_Jenkins高级pipeline应用】

一、创建项目选择pipeline的风格 它主要是以脚本(它自己的语言)的方式进行运行,一般由运维去做的事情,作为测试而言。了解即可。 --- 体现形式全部通过脚本去实现:执行之前(拉取代码)执行&…

Linux:Linux网络总结(附下载链接)

文章目录 下载链接网络问题综合问题访问一个网页的全过程?WebSocket HTTPHTTP基本概念GET与POSTHTTP特性HTTP缓存技术HTTP的演变HTTP1.1 优化 HTTPSHTTP与HTTPS有哪些区别?HTTPS解决了HTTP的哪些问题?HTTPS如何解决的?HTTPS是如何…

# Redis 入门到精通(二)通用指令

Redis 入门到精通(二)通用指令 一、redis 通用指令-key 基本操作 1、key 特征 key是一个字符串,通过key获取redis中保存的数据。 2、key 应该设计哪些操作? 对于 key 自身状态的相关操作,例如:删除,判定存在&…

企业网络实验(vmware虚拟机充当DHCP服务器)所有IP全部保留,只为已知mac分配固定IP

文章目录 需求实验修改dhcp虚拟机配置文件测试PC获取IP查看user-bind 需求 (vmware虚拟机充当DHCP服务器)所有IP全部保留,只为已知mac分配固定IP 实验 前期配置: https://blog.csdn.net/xzzteach/article/details/140406092 后续配置均在以上配置的前…

ChatGPT对话:如何制作静态网页?

【编者按】编者在很早以前制作过静态网页,之后长期没有使用,已完全不知道最新现状了。所以,从制作工具开始询问ChatGPT,回答非常全面,完全可以解决初学者的问题。 编者虽然长期不制作网页,但一直在编程&…

keepalive和haproxy

1、keepalive 1.1概念 调度器的高可用 vip地址主备之间的切换,主在工作时,vip地址只在主上,主停止工作,vip漂移到备服务器 在主备的优先级不变的情况下,主恢复工作,vip会飘回到主服务器 1、配优先级 …

C#,开发过程中技术点GPT问答记录

6、为什么说GUI编程是事件驱动的? GUI(图形用户界面)编程是一种以图形方式构建用户界面的编程方法,它主要采用事件驱动模型进行程序逻辑的组织。在事件驱动的编程中,程序并不按照固定的顺序线性执行,而是等…

Java枚举类

深入理解Java枚举类 什么是枚举类? 枚举类(enum)是Java中一种特殊的类,用于表示一组固定的常量。例如,一年四季(春、夏、秋、冬)、一周七天(周一到周日)等。这些常量是…

【RabbitMQ】一文详解消息可靠性

目录: 1.前言 2.生产者 3.数据持久化 4.消费者 5.死信队列 1.前言 RabbitMQ 是一款高性能、高可靠性的消息中间件,广泛应用于分布式系统中。它允许系统中的各个模块进行异步通信,提供了高度的灵活性和可伸缩性。然而,这种通…

.NET MAUI开源架构_1.学习资源分享

最近需要开发Android的App,想预研下使用.NET开源架构.NET MAUI来开发App程序。因此网上搜索了下相关资料,现在把我查询的结果记录下,方便后面学习。 1.官方文档 1.1MAUI官方学习网站 .NET Multi-Platform App UI 文档 - .NET MAUI | Micro…

Leetcode100.判断两颗二叉树是否相同

题目描述 代码和 leetcode101. 判断二叉树是否对称非常类似 。 答案 public boolean isSameTree(TreeNode p, TreeNode q) {if (p null && q null) { //p,q都为空return true;} else if (p null || q null) { //p和q中只有一个为空return false;} else { //p和q都不…

块设备驱动实现--模拟一个块设备

1、前言 存储层在收到I/O请求后进行数据处理,再给上层应答,本文实现一个实际的块设备驱动。使用Linux5.4为基础,进行框架搭建和功能实现。 2、ko模块与编译 首先定义一个init和exit函数,去注册自己的驱动函数模块。 #include &l…

Open-TeleVision——通过VR沉浸式感受人形机器人视野:兼备远程控制和深度感知能力

前言 7.3日,我司七月在线(集AI大模型职教、应用开发、机器人解决方案为一体的科技公司)的「大模型机器人(具身智能)线下营」群里的一学员发了《Open-TeleVision: Teleoperation with Immersive Active Visual Feedback》这篇论文的链接,我当时快速看了一…

shell脚本之if/case语句

一、条件测试 1、1 返回码 $? $? :返回码,用来判断命令或者脚本是否执行成功。 0 :表示true ,成功;非0 则表示flase ,失败。 1、2 test命令 可以进行条件测试,然后根据返回值来判断条件是否成立 -e…

周末总结(2024/07/13)

工作 人际关系核心实践: 要学会随时回应别人的善意,执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己,抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内 工作上的要点 现状(接受破烂现状,改变…

RISC-V异常处理流程概述(2):异常处理机制

RISC-V异常处理流程概述(2):异常处理机制 一、异常处理流程和异常委托1.1 异常处理流程1.2 异常委托二、RISC-V异常处理中软件相关内容2.1 异常处理准备工作2.2 异常处理函数2.3 Opensbi系统调用的注册一、异常处理流程和异常委托 1.1 异常处理流程 发生异常时,首先需要执…

Linux重要知识点

1. 命令行操作 Linux大多数操作都是通过命令行进行的。熟悉常用命令和脚本是使用Linux的基础。 基本命令:如 ls, cd, cp, mv, rm,这些命令用于文件和目录的管理。文件权限和管理:了解如何使用 chmod, chown, chgrp 等命令来管理文件权限和所…