leetcode之hot100---142环形链表II(C++)

embedded/2024/12/26 19:45:24/

思路一:哈希表

参考环形链表的思路一,当在哈希表中找到第一个表外待入表的节点,说明链表存在环,且该节点为入环的第一个节点

class Solution {
public:ListNode *detectCycle(ListNode *head) {unordered_set<ListNode *> visited;while (head != nullptr) {if (visited.count(head)) {return head;}visited.insert(head);head = head->next;}return nullptr;}
};
  • 时间复杂度:O(N)

  • 空间复杂度:O(N)

思路二:快慢指针

与前述环形链表不同的是,判断是否存在环中的快慢指针最终可能不会返回入环点

图示解释:

初始时, 

slow: 3        

fast: 3

第一次移动:

slow: 3->2

fast: 3->0

第二次移动:

slow: 3->2->0

fast: 3->0->2

第三次移动:

slow: 3->2->0->-4

fast: 3->0->2->-4

由上图示例可知,slow最终返回并不是入环的第一个节点,因此需要想办法让代码返回入环的第一个节点

快慢指针关系:

 如果将环外的距离用a来表示,入环的第一个节点与两指针相遇的距离用b来表示,环中除b外的距离用c表示,那么可以得到两指针移动的距离:

s(fast) = a + n * (b + c) + b

s(slow) = a + b

由上图总结可得:

每次slow移动一步,fast每次移动两步,也就是说fast移动的距离是slow移动的两倍,用s(slow)和s(fast)分别代表两个指针移动的距离,那么两者的关系可以用数学公式可以这样表示:

s(fast) = 2 * s(slow)

整理上述三个式子可得: 

2 * ( a +b ) = a + n * (b + c) + b

也就是:

a = c + (n - 1) * (b +c)

 因此,可以额外使用一个指针ptr,使其最开始指向链表头部;随后,它和 slow 每次向后移动一个位置。最终,它们会在入环点相遇,也就是说,ptr走a个距离后会和走c + (n - 1) * (b +c)距离的slow在入环的第一个节点处相遇

 

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *detectCycle(ListNode *head) {if(head == nullptr || head->next == nullptr){return nullptr;}ListNode* slow = head;ListNode* fast = head;while(fast != nullptr){slow = slow->next;if(fast->next == nullptr){return nullptr;}fast = fast->next->next;if(slow == fast){ListNode* ptr = head;while(ptr != slow){ptr = ptr->next;slow = slow->next;}return ptr;}}return nullptr;}
};
  • 时间复杂度:O(N)

  • 空间复杂度:O(1)


http://www.ppmy.cn/embedded/148394.html

相关文章

elasticsearch中使用fuzzy查询

文章目录 1. fuzzy 查询的基本用法示例文档&#xff1a; 2. 基本的 fuzzy 查询解释&#xff1a;查询结果&#xff1a; 3. fuzziness 的不同设置**fuzziness 设置为数字&#xff08;编辑距离&#xff09;**fuzziness 设置为 0 4. 更多的 fuzzy 查询选项示例&#xff1a; 5. 总结…

视频矩阵系统怎么做?深度解析矩阵全链路玩法

今天咱们聊聊&#xff0c;为什么企业做短视频一定要搞矩阵&#xff1f;还&#xff0c;这个矩阵号到底应该怎么打造&#xff1f; 什么是抖音矩阵账号&#xff1f;简单来说&#xff0c;就是在一个品牌或企业在抖音平台上创建并管理多个员工账号&#xff0c;这些账号都和主账号有…

Windows查看MD5

如何在Windows&#xff0c;查看一个文件的MD5 1、ctrlr&#xff0c;输入cmd 2、执行命令certutil -hashfile 文件路径&#xff08;按住将文件拖进来就行&#xff09; MD5 3、执行命令certutil -hashfile 文件路径&#xff08;按住将文件拖进来就行&#xff09;SHA1 可查看SHA…

Gaea学习笔记总结

Gaea 是一款地形创建软件&#xff0c;它内置了丰富的地貌节点&#xff0c;能快速生成像山脉、荒原峡谷、河流、湖泊等地貌特征。 节点解释使用方法概述Primitives&#xff08;基本体&#xff09;Constant&#xff08;常数&#xff09;创建输出&#xff0c;一般用来输出Hight&am…

flux模型的下载、配套及简易使用记录(ubuntu)

我在学习使用时&#xff0c;很迷惘各个模型放在什么 位置。以及他们的作用。所以系统的了解了一下。然后记录了&#xff0c;一下&#xff0c;希望能帮助到想了解这个知识的朋友。 另外&#xff0c;我将持续的更新这个专辑。记录我在学习和使用过程中关于comfy的方面。希望得到…

Centos7 部署ZLMediakit

1、拉取代码 #国内用户推荐从同步镜像网站gitee下载 git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit #千万不要忘记执行这句命令 git submodule update --init 2、安装编译器 sudo yum -y install gcc 3、安装cmake sudo yum -y install cmake 4…

蓝桥杯摆烂第三天

小蓝给学生们组织了一场考试&#xff0c;卷面总分为 100 分&#xff0c;每个学生的得分都是一个 0 到 100 的整数。 请计算这次考试的最高分、最低分和平均分。 输入描述 输入的第一行包含一个整数 n (1≤n≤104)&#xff0c;表示考试人数。 接下来 n 行&#xff0c;每行包…

Kafka 常见问题

一、Kafka 如何实现高可用性&#xff1f; Kafka 的高可用性是通过多个机制和配置来实现的&#xff0c;主要包括以下几个方面&#xff1a; 分区与副本 Kafka 将主题&#xff08;Topic&#xff09;划分为多个分区&#xff08;Partition&#xff09;&#xff0c;每个分区可以有多…