66、【链表】leetcode——142. 环形链表 II(C++、Python版本)

news2024/9/24 11:32:38

题目描述

方法一:哈希表

C++版本

/**
 * 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) {
        unordered_set<ListNode*> visited;
        while(head != NULL) {
            if(visited.count(head))		// 若第一次遇到之前遍历过的链表,则为环的入口
                return head;
            visited.insert(head);		// 记录遍历过的链表
            head = head->next;
        }

        return NULL;
    }
};

Python版本

通过集合来实现

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def detectCycle(self, head: ListNode) -> ListNode:
        visited = set()                
        while head != None :                        
            if id(head) in visited :              
                return head            
            visited.add(id(head))
            head = head.next                        

        return None
            


id() 函数返回对象的唯一标识符,标识符是一个整数。

时间复杂度 O ( n ) O(n) O(n)
空间复杂度 O ( n ) O(n) O(n)

方法二:快慢指针

image.png
slow指针走过的为a+b,fast指针走过的为a+b+n(b+c),其中n为fast指针走过的圈数。
因为fast一次走两步,slow一次走一步,那么fast就会相对于slow以速度为1步进行运动,那么总有一次二者会相遇。

根据二者速度关系可列等式 2 ∗ ( a + b ) = ( a + b ) + n ( b + c ) 2*(a+b) = (a+b)+n(b+c) 2(a+b)=(a+b)+n(b+c),可得 a = n ( b + c ) − b a = n(b+c)-b a=n(b+c)b,即 a = ( n − 1 ) ( b + c ) + c a=(n-1)(b+c)+c a=(n1)(b+c)+c,由该公式可得,走过距离a等于走n-1圈环的距离再加上从相遇点走过距离c。

因此,若想得到入口点,可让一个指针从头节点出发,另一个指针从相遇点出发。两者必然会在某一时刻,再入口点相遇。

C++版本

/**
 * 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) {
        ListNode* fast = head;
        ListNode* slow = head;

        while(fast != NULL && fast->next != NULL){
            fast = fast->next->next;
            slow = slow->next;
            if(fast == slow){		// 找到相遇点
                ListNode* ptr = head;	// 设置一个从头结点出发的指针
                while(ptr != slow){		// 当从头结点出发的结点和从相遇点出发的结点相遇时,则为入口点
                    ptr = ptr->next;
                    slow = slow->next;
                }
                return ptr;
            }
        }
        return NULL;
    }
};

Python版本

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def detectCycle(self, head: ListNode) -> ListNode:
        fast, slow = head, head

        while fast != None and fast.next != None :
            fast = fast.next.next
            slow = slow.next
            if fast == slow :
                ptr = head
                while slow != ptr :
                    slow = slow.next
                    ptr = ptr.next
                return ptr

        return None


时间复杂度 O ( n ) O(n) O(n)
空间复杂度 O ( 1 ) O(1) O(1)

参考文章:
环形链表 II

142.环形链表II

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

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

相关文章

年终小结:苟住

大家好&#xff0c;我是一哥&#xff0c;新的一年又要到来了&#xff0c;一个词总结下今年的状态 01 工作 2022真的比较难&#xff0c;作为互联网技能从业人员&#xff0c;相信大家一定经历了很多。这一年虽然我没有被毕业&#xff0c;但也经历了公司的业务调整&#xff0c;曾…

C51 --串口通信

3.2.1 串口的连接方式 RXD&#xff1a;数据输入引脚&#xff0c;接受数据&#xff1b;STC89系列对应P3.0口&#xff0c;上官一号有单独引出 TXD&#xff1a; 数据发送引脚&#xff0c;数据发送&#xff1b;STC89系列对应P3.0口&#xff0c;上官一号有单独引出 接线方式&…

2022 IoTDB Summit:IoTDB PMC 田原《大规模并行处理与边缘计算在 Apache IoTDB 中的实践》...

12 月 3 日、4日&#xff0c;2022 Apache IoTDB 物联网生态大会在线上圆满落幕。大会上发布 Apache IoTDB 的分布式 1.0 版本&#xff0c;并分享 Apache IoTDB 实现的数据管理技术与物联网场景实践案例&#xff0c;深入探讨了 Apache IoTDB 与物联网企业如何共建活跃生态&#…

带头双向循环链表的增删改查

目录&#x1f921;前言&#x1f60a;带头双向循环链表&#x1f44d;链表实现&#x1f620;插入-头插&#xff0c;尾插&#xff0c;随机插✅删除-头删&#xff0c;尾删&#xff0c;随机删&#x1f602;链表搜索和链表修改&#x1f4a1;总结&#x1f921;前言 本篇博客主要是介绍…

Qt编写雷达模拟仿真工具(模拟点/歼击机/航母/发射导弹/爆炸效果/激光雷达等)

一、简单介绍 雷达模拟仿真工具&#xff0c;主要通过模拟点模拟相关物体&#xff0c;方位、航向角、距离、速度&#xff0c;并且显示相关详情信息可建立跟踪线建立与模拟点联系。可自定义更换模拟点背景达到更加逼真效果&#xff0c;如歼击机&#xff0c;航母发射导弹效果&…

单例模式,适配器模式,迭代器模式,工厂模式(C++实现)

设计模式就相当于编程中的“孙子兵法”&#xff0c;是经过很久的时间以及各路大神总结出来的多种实用&#xff0c;高效的业务设计中的套路; 单例模式 一个类只能创建一个对象的情况下的一种设计模式&#xff08;eg&#xff1a;服务器只有一个&#xff09;&#xff0c;即单例模…

【论文阅读】《知识图谱研究综述》;Knowledge Graph:概念及主要应用,主要特征、构建的主要技术、未来研究方向。

目录 1. 文章来源2. 简介3. 什么是知识图谱4. Knowledge Graph 主要特征5. Knowledge Graph 构建的主要技术6. Knowledge Graph 未来研究方向1. 文章来源 该paper来自于知网,请尊重原创,这里仅作为学习笔记~ 2. 简介 知识图谱将知识库以一种图谱的形式展现出来,使知识具有…

opencv-python常用函数解析及参数介绍(一)——图像读取及其通道与灰度

opencv-python中一些常用函数解析及参数介绍前言1.读图片读彩图读灰度图2.显示图片显示彩图显示灰度图灰度图与彩图的区别从彩图中分离单通道通道合并3.保存图片4.灰图的通道分离5.读取视频前言 本文将简单介绍opencv-python中的图像以及视频的读取&#xff0c;并且介绍灰度图…

Hello 2023

年初到年尾&#xff0c;感觉刚写完《Hello 2022》&#xff0c;就要迎接2023了。今天是2022最后一天&#xff0c;本来是元旦假期的第一天&#xff0c;奈何要来公司加班&#xff0c;抽个时间来回顾下 2022 吧。 2022 年和2021 一样也是里程碑的一年&#xff0c;完成了两件大事&a…

使用CSS提高网站性能的30种方法

根据httparchive.org的页面重量报告&#xff0c;CSS在平均70个请求和2MB的网页上占7个HTTP请求和70Kb的代码。这并不是网站性能糟糕的最坏原因&#xff08;我正看着你呢&#xff0c;JavaScript&#xff09;&#xff0c;但CSS面临着特定的挑战&#xff1a; CSS会阻止渲染&#x…

【C++进阶】多态

文章目录多态的概念多态的定义及实现抽象类多态的原理多继承和单继承关系中的虚表函数继承和多态常见的问题多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 …

我的2022年,一位双非生的平淡一年

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 前言 一谈到年终总结&#xff0c;其实还是很多的遗憾&#xff0c;我和大部分人一样&#xff0c;走过这一年的路途&#xff0c;发现自己除去每年头发越来越少&#xff0c;脸色日渐不佳。好像没有什…

Web 和移动应用程序测试之间的区别

智能手机改变了人类与技术互动的方式。无论是旅行、健身、生活方式、视频游戏&#xff0c;甚至是服务&#xff0c;都只需触手可及(字面意思就是如此)。我们只需要看看越来越多的智能手机或平板电脑用户与桌面用户就可以掌握这一现实。 根据一项调查&#xff0c;从 2021 年 4 月…

Dubbo(尚硅谷)学习笔记3

这是我们正常启动&#xff1a; 现在我们去把zookeeper注册中心关掉。 此时我们的注册中心是用不了的。 但是我们的数据还有&#xff0c;也就是我们的消费者还是能调用我们的提供者中的方法。 那么我们现在来试一下dubbo直连&#xff0c;也就是没有注册中心&#xff0c;我们也可…

VideoRender和ImageRender中的一些c++知识点

1.inline C中的inline用法_路痴的旅行的博客-CSDN博客 1 引入inline关键字的原因在c/c中&#xff0c;为了解决一些频繁调用的小函数大量消耗栈空间&#xff08;栈内存&#xff09;的问题&#xff0c;特别的引入了inline修饰符&#xff0c;表示为内联函数&#xff0c;栈空间就是…

深入理解计算机系统_静态链接和动态链接以及静态库和动态库

这篇文章记录静态链接和动态链接以及静态库和动态库的原理。 1 静态链接和动态链接 链接其实就是连接的意思&#xff0c;将所有相关的东西连接起来。 1.1 静态链接 什么是静态链接&#xff1f;编译时候的链接就是静态链接&#xff0c;所以ld/collect2链接程序&#xff0c;也…

公司让我一个人干数据中台,是不是可以准备找下家了

大数据群里&#xff0c;有个哥们问了下面这样一个问题&#xff0c;让刚刚阳康返工的群友们笑的心跳加速&#xff0c;直接炸锅。 开工有惊喜 一个人搞一个数据中台&#xff01;这是啥神仙领导做出来的决策&#xff1f;是发烧的时候拍脑袋定的吗&#xff1f;热心的群友也都给出了…

vector类的使用

目录 ​一、vector类的组织形式 二、vector类的成员函数 1.默认成员函数 &#xff08;1&#xff09;构造函数、拷贝构造函数 &#xff08;2&#xff09;析构函数和赋值运算符重载 2.容量操作 3.迭代器&#xff08;iterator&#xff09; 4.元素访问 5.修改操作 一、vec…

web3调研:Dusk Network调研

在此声明&#xff0c;仅做分享&#xff0c;绝不存在倡导炒币行为 原文链接&#xff1a;Dusk 调研报告 web3产品调研系列 1、web3调研&#xff1a;Iron fish调研 2、web3调研&#xff1a;Dusk Network调研 目录web3产品调研系列一、背景概述二、项目介绍2.1 创始团队2.2 项目融…

【数据结构】三万字图文讲解带你手撕八大排序(附源码)

&#x1f451;作者主页&#xff1a;进击的安度因 &#x1f3e0;学习社区&#xff1a;进击的安度因&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 文章目录一、前言二、排序的概念和运用三、八大排序讲解及实现1、直接插入排序1.1 排序思路1.2 代…