力扣142. 环形链表 II

题目

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

链接:142. 环形链表 II - 力扣(LeetCode)

题解

方法一:设置两个指针,一个指针指向链表头结点,一个指针指向判环时快慢指针相遇的位置,然后两个指针同时走,它们会在环的第一个结点处相遇。

判断链表是否有环:力扣141. 环形链表_啊哈leelee~的博客-CSDN博客

证明如下。

假设链表起始结点head到环起始结点head'的距离为L,环起始结点head'到快慢指针相遇结点meet的距离为X,环的长度为C,则meet到head'的距离为C-X。

 在判环时,慢指针slow走的路径长度为L+X,快指针fast走的路径长度为L+nC+X(n>=1)。而fast所走路径长度是slow所走路径长度的2倍,即L+nC+X=2*(L+X),展开得L= nC-X,也就是L=(n-1)C+C-X。即一个指针从head开始走,一个指针从meet开始走,这两个指针一定会在环起始结点相遇。

注意,在slow进环之前,fast可能已经在环里走了n圈了;slow进环之后,fast一定会在一圈之内追上slow,因为slow和fast之间的距离最大是C,而slow和fast每移动一次,它们俩之间的距离就会减1,所以在slow移动一圈之前fast一定会追上。

代码如下:

struct ListNode *detectCycle(struct ListNode *head) 
{struct ListNode* slow = head;struct ListNode* fast = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;//寻找快慢指针相遇结点if (slow == fast){//寻找环起始结点struct ListNode* meet = slow;while (head != meet){head = head->next;meet = meet->next;}return meet;}}return NULL;
}

 方法二:设置一个指针meet指向快慢指针相遇的位置,设置一个指针meetNext指向meet的next,然后把meet的next置空,把问题转化为求解两个链表相交结点。如下图所示,问题转化为求解以head为头结点的链表以meetNext为头结点的链表相交结点

求解链表相交结点:力扣160. 相交链表_啊哈leelee~的博客-CSDN博客

 代码如下:

struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB)
{struct ListNode* tailA = headA;struct ListNode* tailB = headB;int lenA = 1;int lenB = 1;while (tailA->next){tailA = tailA->next;lenA++;}while (tailB->next){tailB = tailB->next;lenB++;}if (tailA != tailB)return NULL;struct ListNode* longList = headA;struct ListNode* shortList = headB;if (lenA < lenB){longList = headB;shortList = headA;}int gap = abs(lenA - lenB);while (gap--){longList = longList->next;}while (longList != shortList){longList = longList->next;shortList = shortList->next;}return longList;
}struct ListNode* detectCycle(struct ListNode* head)
{struct ListNode* slow = head;struct ListNode* fast = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;//找到相遇结点if (slow == fast){struct ListNode* meet = slow;struct ListNode* meetNext = meet->next;meet->next = NULL;head = getIntersectionNode(head, meetNext);return head;}}return NULL;
}

 

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

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

相关文章

支付通道及系统设计

支付渠道&#xff0c;也可以叫支付通道&#xff0c;是指能够提供资金流转功能的通道&#xff0c;包括但不限于银行、第三方支付机构。我们常见的借记卡&#xff08;储蓄卡&#xff09;、贷记卡&#xff08;信用卡&#xff09;、微信、支付宝、云闪付等支付方式&#xff0c;都是…

使用vue3 + Ts + Vite + ElementPlus实现一个抽奖程序

一. 说明 这是一个通过vue3 Ts Vite ElementPlus实现的一个抽奖程序。项目链接 二. 整体架构与功能描述 左侧设置了奖品说明&#xff0c;每个奖项配有文字和图片简介。总共设置了四个奖项&#xff0c;分别是特等奖1名&#xff0c;一等奖2名&#xff0c;二等奖5名&#xf…

Eureka的使用手册

一、导入依赖&#xff08;服务端和客户端导入的依赖不一样&#xff09; 服务端&#xff1a; <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependenc…

Camtasia Studio 2023怎么导出mp4格式的视频的详细教程介绍

很多用户刚接触Camtasia Studio 2023&#xff0c;不熟悉如何保存mp4格式的视频。在今天的文章中小编为大家带来了Camtasia Studio 2023保存为mp4格式的视频的详细教程介绍。 Camtasia Studio 2023保存为mp4格式的视频的详细教程 1、 打开Camtasia Studio。 Camtasia Studio- …

[相遇 Bug] - ImportError: numpy.core.multiarray failed to import

背景: 因为最近在看点云模型, 在自己的环境上部署该项目: https://github.com/open-mmlab/OpenPCDet/tree/master 执行命令: 这里执行github项目给的demo.py文件, 命令格式如下: python demo.py --cfg_file cfgs/kitti_models/pointpillar.yaml --ckpt xxx/pointpillar_772…

PLSQL编程

1.概念和目的 1.1. 什么是PL/SQL? PL/SQL&#xff08;Procedure Language/SQL&#xff09; 是Oracle对sql语言的过程化扩展 (类似于Basic)&#xff1b; 指在SQL命令语言中增加了过程处理语句&#xff08;如分支、循环等&#xff09;&#xff0c;使SQL语言具有过程处理能力。…

做渲染多好的CPU配置才够用?经常看到的核心和线程数到底是什么?

很多设计师想买一台做渲染的电脑时&#xff0c;经常会看到处理器&#xff08;CPU&#xff09;的介绍中提到几核几线程的信息&#xff0c;却不懂到底是什么意思。其实CPU的几核几线程是指CPU的核心数和线程数&#xff0c;它们是衡量CPU性能的两个重要指标。那么做渲染要有多好的…

等保——windows终端和服务器测评

一、本文适用于Windows系统&#xff0c;但有些版本不适用&#xff0c;例如win10、win11等&#xff0c;因为没有密码策略模块 二、针对于win7的测评过程 1、winR打开命令行&#xff0c;输入gpedit.msc&#xff0c;打开本地组策略编辑器&#xff08;win10以上版本没有这个模块&…

QQ号码3个月未登陆真的要回收?

7月17日消息&#xff0c;微信号长期未使用会被回收的消息引起热议。 腾讯微信团队微博发文称&#xff1a;为保障用户的微信账号安全&#xff0c;注册后不活跃&#xff0c;长期未登录&#xff0c;并且没有零钱的微信账号&#xff0c;会被系统注销&#xff0c;无法使用。 不过也有…

海外媒体发稿:链游媒体发稿写作方法及优缺点解析

链游媒体发稿是一种新的媒体发布机制&#xff0c;它可以把信息准确、及时、有效地传播给大量的人&#xff0c;帮助企业实现信息的最大化传播&#xff0c;因此越来越多的公司也开始使用链游媒体发稿服务&#xff0c;本文就介绍链游媒体发稿写作的方法及小技巧。 一、链游媒体发稿…

JVM系统优化实践(19):GC生产环境案例(二)

您好&#xff0c;这里是「码农镖局」CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; 接昨天的问题继续来说&#xff0c;在高并发场景中&#xff0c;对象过多容易导致OOM。由于高并发导致Young GC存活对象过多&#xff0c;因此会有太多对象进入老年代&#xf…

2.3Listbox列表部件

2.3Listbox列表部件 创建主窗口 window tk.Tk() window.title(my window) window.geometry(200x200)创建一个label用于显示 var1 tk.StringVar() #创建变量 l tk.Label(window,bgyellow,width4,textvariablevar1) l.pack()创建一个方法用于按钮的点击事件 def print_s…