当前位置: 首页 > news >正文

力扣 142题 环形链表Ⅱ 记录

题目描述

给定一个链表的头节点  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
解释:链表中没有环。

思路

使用快慢指针的策略。基本思想是使用两个指针,一个快指针(每次移动两步)和一个慢指针(每次移动一步)。如果链表中存在环,快指针最终会追上慢指针。当两个指针相遇时,将一个指针重置到链表的头部,然后两个指针都以相同的速度移动,直到它们再次相遇,这次相遇的节点就是环的起点。

算法流程:

  1. 寻找相遇点:
    当 fast 和 slow 指针在链表中前进时,如果链表存在环,由于 fast 指针的速度是 slow 指针的两倍,fast 会在某个时刻追上 slow(在环内相遇)。这是因为在环中,快指针最终会从后面追上慢指针;
    如果 fast 指针遇到 nullptr(表示链表尾部),则链表中没有环,函数返回 nullptr。

  2. 寻找环的起点:
    当 fast 和 slow 相遇时,将其中一个指针(例如 fast)放回链表的起始位置 head,然后 fast 和 slow 同时以相同的速度(每步一节点)前进;
    当 fast 和 slow 再次相遇时,相遇点即为环的起点。这是因为从头节点到环入口的距离等于从相遇点到环入口的距离。

完整代码

#include<iostream>
using namespace std;struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(nullptr) {}
};class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode *fast = head;ListNode *slow = head;while(fast != nullptr && fast->next != nullptr){fast = fast->next->next;slow = slow->next;if(fast == slow){ListNode *index1 = fast;ListNode *index2 = head;while(index1 != index2){index1 = index1->next;index2 = index2->next;} return index1;}}     return nullptr;}
};int main()
{Solution s;ListNode *head = new ListNode(0);ListNode *node1 = new ListNode(1);ListNode *node2 = new ListNode(2);ListNode *node3 = new ListNode(3);head->next = node1;node1->next = node2;node2->next = node3;node3->next = node2;ListNode *cycleNode = s.detectCycle(head);if (cycleNode) {cout << "The starting point value of the linked list is: " << cycleNode->val << endl;} else {cout << "There is no ring in the linked list" << endl;}return 0;
}
http://www.lryc.cn/news/359289.html

相关文章:

  • 乐观锁 or 悲观锁 你怎么选?
  • 《庆余年算法番外篇》:范闲通过最短路径算法在阻止黑骑截杀林相
  • 大一C语言课设 服装销售系统 代码实现与项目总结
  • 从新手到专家:深入探索JVM垃圾回收--开端篇
  • R可视化:另类的柱状图
  • Docker的数据管理(数据卷+数据卷容器)
  • 字符串-至多包含K种字符的子串中最长子串(mid)
  • Docker从安装开始精通
  • MFC:初步理解序列化与反序列化(含代码实现)
  • python程序控制结构
  • 【GD32】04 - Timer定时器
  • Golang | Leetcode Golang题解之第123题买卖股票的最佳时机III
  • Leetcode2028. 找出缺失的观测数据
  • 如何在CentOS中合理划分磁盘空间以优化系统性能
  • 算法(十一)贪婪算法
  • Rust之函数式语言特性:迭代器和闭包(一):概述
  • 配置资源管理
  • unity2020打包webGL时卡进程问题
  • 云原生架构相关技术_3.无服务器技术
  • Leetcode:Z 字形变换
  • Python 3 判断文件是否存在
  • (深度学习记录)第TR3周:Transformer 算法详解
  • 谷神前端组件增强:自定义列
  • 31-ESP32-S3-WIFI篇-02 Event Group (事件标记组)
  • 构建企业级AI私有知识库
  • C语言王国——杨氏矩阵
  • 陪玩小程序都需要怎么做?
  • postgressql——子事务可见性判断 性能问题(8)
  • 20240531在飞凌的OK3588-C开发板上跑原厂的Buildroot测试USB摄像头
  • 从0开始学统计-什么是回归?