环形链表 II - 力扣(LeetCode)C语言

devtools/2024/9/25 10:31:21/

142. 环形链表 II - 力扣(LeetCode) (点击前方链接即可查看题目)

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

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出:返回索引为 0 的链表节点
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出:返回 null
解释:链表中没有环。

提示:

  • 链表中节点的数目范围在范围 [0, 104] 内
  • -105 <= Node.val <= 105
  • pos 的值为 -1 或者链表中的一个有效索引

一、解法一

        判断有环请参考:环形链表 - 力扣(LeetCode) C语言-CSDN博客

 看完判断有环之后,就只剩下寻找环的第一个结点: (C为圆环长度)

        fast和slow在环相遇时,slow走了L+X, fast走了L+nC+X(n >= 1, 因为环可能大可能小, 若为大环, fast追击一圈即可追上slow, 若为小环,slow还没有进环时,fast已经转了好几圈了)

        因为slow走一步,fast走两步,所以距离关系如下:

2(L+X) = L+nC+X

化简得: L+X = nC

即: L = ( n -1)C + (C -X)

其中:  (C-X) 是相遇时未走完一圈的剩余路程, 所以将slow重新从head走到环的第一个结点时,

meet和slow一样一次走一步,当slow到达第一个结点时,meet也刚刚好到达第一个结点.

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode *detectCycle(struct ListNode *head) 
{struct ListNode* fast = head;struct ListNode* slow = head;struct ListNode* meet = NULL;while(fast && fast->next){fast = fast->next->next;slow = slow->next;if(fast == slow){meet = fast;slow = head;while(slow != meet){slow = slow->next;meet = meet->next;}return meet;}}return NULL;
}

 二、解法二:转化为相交链表

        还是找到meet点时,将meet->next = NULL; 此变成了相交链表求解,第一个交点

解法请参考相交链表 - 力扣(LeetCode)C语言-CSDN博客


http://www.ppmy.cn/devtools/86566.html

相关文章

二进制八进制十六进制转十进制,十进制转二进制八进制十六进制,C#与c++实现,学习日志

二进制八进制十六进制转十进制 与相反的C#实现 返回值带有开头&#xff0c;0b,0o,0x&#xff0c;返回值是string类型 static void Main(string[] args){//0b或者0B//0O 或者0//直接写//0x或者0XConvertDecimalToBinary(7).ForEach(x > { Console.Write(x); });Console.Writ…

RabbitMQ高级篇(如何保证消息的可靠性、如何确保业务的幂等性、延迟消息的概念、延迟消息的应用)

文章目录 1. 消息丢失的情况2. 生产者的可靠性2.1 生产者重连2.2 生产者确认2.3 生产者确认机制的代码实现2.4 如何看待和处理生产者的确认信息 3. 消息代理&#xff08;RabbitMQ&#xff09;的可靠性3.1 数据持久化3.2 LazyQueue&#xff08; 3.12 版本后所有队列都是 Lazy Qu…

PHP表单验证

PHP 表单验证是确保用户输入数据符合特定要求的关键步骤&#xff0c;它有助于维护数据的完整性和准确性&#xff0c;同时提高应用的安全性。以下是一个详细的 PHP 表单验证教程&#xff1a; 一、表单的创建 首先&#xff0c;你需要在 HTML 文档中创建一个表单。表单包含输入字…

Photoshop技巧:按住Ctrl键点击图层缩略图,快速选择不透明像素

在Photoshop中&#xff0c;按住Ctrl键点击图层缩略图是一个常用的操作&#xff0c;它主要用于快速选择该图层中的不透明像素&#xff0c;从而创建一个选区。以下是对这一操作的详细解释&#xff1a; 操作步骤 打开Photoshop并加载图像&#xff1a; 启动Photoshop软件。使用“文…

在 LCD 上显示 png 图片-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

在 LCD 上显示 png 图片 PNG 简介 无损压缩&#xff1a;PNG 使用 LZ77 派生算法进行无损压缩&#xff0c;确保图像质量不受损&#xff0c;且压缩比高 体积小&#xff1a;通过高压缩比&#xff0c;PNG 文件体积小&#xff0c;适合网络传输 索引彩色模式&#xff1a;PNG-8 格式…

我出一道面试题,看看你能拿 3k 还是 30k!

大家好&#xff0c;我是程序员鱼皮。欢迎屏幕前的各位来到今天的模拟面试现场&#xff0c;接下来我会出一道经典的后端面试题&#xff0c;你只需要进行 4 个简单的选择&#xff0c;就能判断出来你的水平是新手&#xff08;3k&#xff09;、初级&#xff08;10k&#xff09;、中…

数据结构初阶(c语言)-排序算法

数据结构初阶我们需要了解掌握的几种排序算法(除了直接选择排序&#xff0c;这个原因我们后面介绍的时候会解释)如下&#xff1a; 其中的堆排序与冒泡排序我们在之前的文章中已经详细介绍过并对堆排序进行了一定的复杂度分析&#xff0c;所以这里我们不再过多介绍。 一&#x…

upload-labs靶场(1-19关)

upload-labs靶场 简介 upload-labs是一个使用php语言编写的&#xff0c;专门收集渗透测试过程中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共19关&#xff0c;每一关都包含着不同上传方式。 注意&#xff1a;能运行<?php phpinfo();?&…