单链表——环形链表II

方法一

难想,但代码容易实现

根据第一道环形链表的题目我们可以得知快慢指针相交的节点,但是如果想要知道进入环形链表的第一个节点,我们就还需要定义一个指针从链表的头节点开始,与相交的节点同时行走,当两个节点重合时重合的那个节点就是环形链表的第一个节点。那么原理是怎样的呢?我们可以定义头节点到进入环形链表的第一个节点的长度为L,进入环形链表的第一个节点到相遇的节点长度为N,整个环形链表的长度为C。则快指针fast走的路程为L+x*C+N,慢指针slow走的路程为L+N,因为快指针走的路程为慢指针走的路程的二倍,所以我们可以得出等式2(L+N)=L+x*C+N,整理后可得L=x*C-N---->L=(x-1)*C+C-N。由此可知两指针相遇的位置距离进入环形链表第一个节点的长度与头节点距离进入环形链表第一个节点的长度相等。所以我们可以来实现一下这个想法。

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

方法二

好想,但代码不容易实现

如果第一种方法不容易想出,那么我们可以应用之前做过的相交链表的思想来实现方法二。当我们找到相遇的节点时,可以将该节点的下一个节点设为新的头节点,再将相遇的节点的next指针置为NULL。这样操作,我们就可以将含头节点的链表与新头节点的链表视为相交链表,然后应用相交链表的思想找出进入环形链表的第一个节点。那么我们现在开始实现一下这个思想。

typedef struct ListNode ListNode;ListNode*Find(ListNode*headA,ListNode*headB)
{ListNode*pcurA=headA;ListNode*pcurB=headB;int lenA=0;int lenB=0;while(pcurA){pcurA=pcurA->next;++lenA;}while(pcurB){pcurB=pcurB->next;++lenB;}int gap=abs(lenA-lenB);ListNode*longList=headA;ListNode*shortList=headB;if(lenA<lenB){longList=headB;shortList=headA;}while(gap--){longList=longList->next;}while(longList!=shortList){longList=longList->next;shortList=shortList->next;}return shortList;}struct ListNode *detectCycle(struct ListNode *head) 
{ListNode*slow=head;ListNode*fast=head;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;if(slow==fast){ListNode*meet=slow;ListNode*newhead=meet->next;meet->next=NULL;return Find(newhead,head);}}return NULL;
}

大家感兴趣的可以自行尝试哦~

. - 力扣(LeetCode)

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

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

相关文章

LeetCode刷题:3.无重复字符的最长子串

问题&#xff1a;首先分析问题得出需求 1.要求得到一个唯一最长子串的序列的长度。 子串&#xff1a;依据其形式是拥有一段长度的&#xff0c;所以考虑滑动窗口 唯一&#xff1a;考虑使用HashSet 需求描述&#xff1a;要求得到滑动窗口的大小&#xff0c;也就是左右指针的距离&…

milvus多个Querynode,资源消耗都打在一个节点上

milvus 查询时的原理 当读取数据时&#xff0c;MsgStream对象在以下场景中创建&#xff1a; 在 Milvus 中&#xff0c;数据必须先加载后才能读取。当代理收到数据加载请求时&#xff0c;会将请求发送给查询协调器&#xff0c;查询协调器决定如何将分片分配到不同的查询节点。…

根据两个位置的经纬度,计算其距离和方位

#include <iostream> #include <cmath>const double EARTH_RADIUS 6371000.0; // 地球半径 (单位&#xff1a;米) const double DEG_TO_RAD M_PI / 180.0;// 计算两个经纬度之间的距离 (单位&#xff1a;米) 和方位 (单位&#xff1a;度) void calculate_distanc…

NoSql数据库Redis集群

一、关系型数据库和 NoSQL 数据库 1.1 数据库主要分为两大类&#xff1a;关系型数据库与 NoSQL 数据库 关系型数据库 &#xff0c;是建立在关系模型基础上的数据库&#xff0c;其借助于集合代数等数学概念和方法来处理数据库中的数据主流的 MySQL 、 Oracle 、 MS SQL Server…

做数据爬虫工作:是否需要准备单独的IP库和爬虫库?

在数据爬虫领域&#xff0c;为了确保高效、稳定且合法地进行数据采集&#xff0c;准备单独的IP库和爬虫库成为了许多爬虫工程师的必备选择。本文将探讨为什么在进行数据爬虫工作时&#xff0c;准备单独的IP库和爬虫库是至关重要的。 一、为什么需要单独的IP库&#xff1f; 1.…

vue2-2024(2)

vue-router 1.路由&#xff08;vue的一个插件&#xff09;&#xff0c;就是一组映射关系&#xff1b; 2.key为路径&#xff0c;value可能是function或component 安装 vue-router vue3 对应vue-router 4&#xff08;npm i vue-router&#xff09; vue2 对应vue-router 3&#…

云计算实训35——镜像的迁移、镜像的创建、使用docker查看ip、端口映射、容器持久化

一、镜像的迁移 打包镜像 docker save -o 文件名称 镜像名&#xff1a;标签 #查看帮助命令[rootdocker ~]#docker --help#查看save打包用法[rootdocker ~]#docker save --help#查看原有镜像[rootdocker ~]#docker images#将镜像打包[rootdocker ~]#docker save -o centos.t…

logrotate.rsyslog文件中的postrotate --- endscript作用

在 logrotate 配置文件中&#xff0c;postrotate 和 endscript 之间的部分用于在日志轮转&#xff08;即日志文件被归档和压缩后&#xff09;执行特定的命令或脚本。这段代码在日志文件完成轮转后执行&#xff0c;通常用于确保日志记录服务正确重新加载并开始使用新的日志文件。…

Python实现图片的拼接

Python实现图片的拼接 Python中有多种方法可以实现图片拼接&#xff0c;下面是一个使用Pillow库的示例&#xff1a; 首先&#xff0c;你需要安装Pillow库&#xff1a; pip install pillow然后&#xff0c;可以使用以下代码实现图片拼接&#xff1a; from PIL import Image#…

MySQL——多表操作(四)子查询(1)带 IN 关键字的子查询

子查询是指一个查询语句嵌套在另一个查询语句内部的查询。它可以嵌套在SELECT、SELECT、INTO 语句、INSERT…INTO 等语句中。在执行查询语句时&#xff0c;首会执行子查询中的语句&#xff0c;然后将返回的结果作为外层查询的过滤条件&#xff0c;在子查询中通可以使用 IN、EXI…

【C++ 面试 - 内存管理】每日 3 题(九)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

uniapp、微信小程序车牌的录入的解决方案

结合uv-ui进行编写&#xff0c;键盘使用uv-ui的组件&#xff0c;其他由我们自己编写。 <template><div class"addCarContent"><div class"boxContent"><div class"carCodeInput" click"getIndex"><div:cl…

紧急通知:避坑花生壳,花生壳退钱!!!推荐使用cpolar

有个需求&#xff0c;需要使用内网穿透功能。 本地使用花生壳搭建还算可以。 基于Ubantu。 然后再通过远程进行了搭建。 但是&#xff0c;搭建不成功。 一直报处于离线状态。 给花生壳客服反馈了&#xff0c;对方技术人员也无法解决。 协商退钱&#xff0c;不同意。 网上…

第八周:机器学习

目录 摘要 Abstract 一、注意力机制V.S.自注意力机制 1、引入 2、注意力机制 3、自注意力机制 二、自注意力机制 1、输入 2、输出 3、序列标注 4、Multi-head Self-attention 5、比较 总结 摘要 前两周学习了CNN的基本架构&#xff0c;针对全局信息的考虑问题&…

通过MessageChannel实现一个深拷贝

深拷贝在前端领域已经是个老生常谈的话题了,说起深拷贝相信大多数人第一反应就是通过JSON,其他的就是可以递归手写一个深拷贝,再就是使用第三方库已经写好的深拷贝,不再重复造轮子,例如:lodash。很早之前也写过关于深拷贝的博文(js深拷贝) 通过JSON进行深拷贝的一些缺陷…

【代码】java 实现定时功能

Timer // 创建一个Timer实例 Timer timer new Timer(); // 安排一个任务在指定延迟后执行&#xff0c;然后每隔指定的周期重复执行 timer.schedule(new TimerTask() { Override public void run() { // 这里编写你要定时执行的任务 System.out.println("Task i…

算法的学习笔记—连续子数组的最大和

&#x1f600;前言 在算法问题中&#xff0c;求解连续子数组的最大和是一个经典问题。给定一个整数数组&#xff0c;找到一个连续的子数组&#xff0c;使得其元素之和最大。本文将详细讲解如何解决这个问题&#xff0c;并提供Java实现代码。 &#x1f3e0;个人主页&#xff1a;…

SpringBoot对接Midjourney Api

提示&#xff1a;SpringBoot对接Midjourney Api 文章目录 目录 文章目录 后端代码 导包 controller层 工具类层 前端代码 申请API 测试结果 后端代码 导包 <!--添加hutool的依赖--><dependency><groupId>cn.hutool</groupId><artifactId&g…

黑神话悟空 PC端配置需求详解:如何为不同游戏体验选择合适的配置?

《黑神话&#xff1a;悟空》是一款备受期待的动作角色扮演游戏&#xff0c;由游戏科学&#xff08;Game Science&#xff09;开发&#xff0c;基于《西游记》改编。随着游戏的发布&#xff0c;许多玩家都在关心一件事&#xff1a;我的电脑能带动这款游戏吗&#xff1f;本文将详…