LCP142 环形链表[leetcode-7]

news2024/9/23 6:32:15

LCP142 环形链表

先上结果

前排提醒,本文有两种解法,和原理分析
在这里插入图片描述

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

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

不允许修改 链表。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

在这里插入图片描述

这道题真是让人思绪万千,有百般解法

  • 最笨的方法是,历遍,每过一个节点就存储起来,每到一个节点再对比。time:O(n*n) space:O(n)
  • 既然涉及对比,首先想到使用hash表来优化查找操作,hash的查找是O(1)所以time:O(n),space:O(n)
  • 最好的方法就是floyd寻圈算法,记录在经典算法这一节中.time:O(n),space:O(1)
    • 不需要额外的存储空间,只需要两个指针
hash的answer
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        unordered_set<ListNode *> visited;
        while (head != nullptr) {
            if (visited.count(head)) {
            //uset.count 此函数接受单个参数element 。表示容器中是否存在需要检查的元素。
                return head;
            }
            visited.insert(head);
            head = head->next;
        }
        return nullptr;
    }
};

floyd的算法

原理分析

  • 在起点处放置两个指针,一快一慢。快指针每次走两个,慢指针每次一个。

  • 循环该步骤,若无环,则到结尾也不会相遇。若存在一个环,那快慢指针将先后进入环中,而速度不同,必然追及,这是一个重要的结论:他们必然相遇在环上

  • 而且相遇的时候,循环的次数=慢指针走过的路程=环的长度,图示法如下
    -在这里插入图片描述

  • 好的,现在我们已经求得**是否有环?环多长?**的问题,下面让我们研究一下环的入口在哪里

  • 也很简单,把一个指针移到链表的开头,另一个指针保持在原地,然后让两个指针的速度都是1,最后两者必然相遇,相遇的点必然是环的开头,同理使用图解法

  • 相遇点到开头的长度=环的长度,既是AP=⚪P 今同减去路程BP,即为重置的指针路程相同,而速度一致,必然有同时到达环之开头B之事实
    在这里插入图片描述

  • 这就是精妙的Floyd判圈

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
       ListNode* fast=head, *slow=head;
       do{
        //如果fast或者下一个元素为null 则必为直线型
        if(!fast|| !fast->next) return nullptr;
        
        fast=fast->next->next;
        slow=slow->next;
       }while(fast!=slow);
        //相遇之后,必然存在节点
        fast=head;
        while(fast!=slow)
        {
            slow=slow->next;
            fast=fast->next;
        }
        return fast;
    }
};

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

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

相关文章

数据结构与算法 - 设计

1. LRU缓存 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0…

0819、0820梳理及一些面试题梳理

一、抓包分析 二、HTTP服务器 三、动态库与静态库 四、一些面试题 指针数组和数组指针的区别&#xff1a;指针数组本质是一个数组&#xff0c;只是数组中存储的是指针变量。数组指针存储的是该数组的起始地址&#xff0c;对该指针来说每偏移一个单位就是偏移了一整个数组的地…

如何寻找专业精密机械零件代加工工厂

在现代工业生产中&#xff0c;精密机械零件的加工质量直接关系到产品的性能和可靠性。因此&#xff0c;寻找一家专业的精密机械零件代加工工厂至关重要。以下时利和整理分享的一些关于寻找专业精密机械零件代加工工厂的关键步骤和要点&#xff0c;帮助你找到合适的合作伙伴。 首…

想投资现货黄金?在TMGM开户需要多少钱?

最近&#xff0c;越来越多的人开始关注黄金投资&#xff0c;希望通过黄金来对冲风险、保值增值。而选择一家可靠的交易平台是进行黄金投资的第一步。TMGM作为全球知名的外汇交易商&#xff0c;也为投资者提供了黄金交易服务。那么&#xff0c;在TMGM开户投资黄金&#xff0c;需…

尚硅谷VUE项目实战,前端项目-尚品汇2

尚硅谷VUE项目实战&#xff0c;前端项目-尚品汇2 1、路由传参 2、重写push

数字转化为千位符形式, 百分比形式

Intl.NumberFormat 千位符&#xff1a; function formatAsRMB(num){return new Intl.NumberFormat(zh-CN,{style: decimal, //将数字格式化为十进制数currency: CNY, // 货币为人民币minimumFractionDigits: 0 // 表示不显示小数部分}).format(num)}const number 12345678co…

【C++进阶学习】第十四弹——特殊类设计——探寻各种情况下类的应用

前言&#xff1a; C类是C很重要的一个部分&#xff0c;在很多应用场景中都发挥着十分重要的作用&#xff0c;今天我们来讲解几个特殊场景下类的应用 目录 一、特殊类&#xff1a;只能在栈/堆上创建对象 1. 只在栈上创建对象 2. 只在堆上创建对象 二、特殊类&#xff1a;不能…

8.20 QT

1.思维导图 2. 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTime> #include <QTimerEvent> #include <QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidge…

Zookeeper中 Server 服务器的四种工作状态详解

Zookeeper中 Server 服务器的四种工作状态详解 1. LOOKING2. FOLLOWING3. LEADING4. OBSERVING&#xff08;3.3.0及以后版本&#xff09; &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; ZooKeeper集群中的服务器主要存在以下四种工作状态&a…

32位入门级MCU(ARM Cortex-M3内核)STM32F103系列

推荐: 32位入门级MCU(ARM Cortex-M3内核)中的六边形战士——STM32F103系列 为什么MCU中需要ADC模块 原创 IPBrain平台君 集成电路大数据平台 2024年08月19日 19:18 北京 自从平台君发布了几期关于MCU的文章之后,后台有很多小伙伴们留言。其中有位读者问平台君:平台君,…

python构建一个web程序

from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return 欢迎来到我的Python Web程序!if __name__ __main__:app.run(debugTrue)1、安装flask D:\Users\USER\PycharmProjects\pythonProject1\p01>pip install flask WARNING: Ignoring invalid…

LLM才硬件(显存)需求

参考&#xff1a; https://www.hardware-corner.net/guides/computer-to-run-llama-ai-model/ GitHub - hiyouga/LLaMA-Factory: Efficiently Fine-Tune 100 LLMs in WebUI (ACL 2024) 直观的一个表&#xff1a;

多模态学习Multimodal Learning:人工智能中的多模态原理与技术介绍初步了解

多模态学习&#xff08;Multimodal Learning&#xff09;是机器学习中的一个前沿领域&#xff0c;旨在综合处理和理解来自不同模态的数据。模态可以包括文本、图像、音频、视频等。随着数据多样性和复杂性增加&#xff0c;多模态学习在自然语言处理、计算机视觉、语音识别等领域…

存储和传输/寻找大端字节序/有哪款MCU或MPU是真支持大端?

文章目录 概述ARM基础ARM 不生产芯片ARM分类和命名ARM指令集和架构ARM架构和内核ARM内核和芯片其他处理器架构 在手册中找寻字节序的踪迹ST 32 MCU 没有大端&#xff1f;Cortex-M 系列Cortex-A 系列Cortex-R 系列小结 芯片外设支持大端字节序DMAC 支持大端字节序的情况CRC 支持…

SpringBoot接入高德地图猎鹰轨迹服务API

SpringBoot接入高德地图猎鹰轨迹服务API 一、AP文档 猎鹰轨迹服务API文档 二、页面图 1、需登录账号&#xff0c;申请对应的应用key值 三、代码部分&#xff1a; 1、控制层 RestController RequestMapping("/gdTrack") public class TrackController {private …

VS Code开发C#(.NET)之快速入门

本篇快速介绍在VS Code中开发C#的完整说明和示例&#xff1a; 环境准备 安装VS Code&#xff1a; 前往Visual Studio Code官网 下载并安装VS Code。 安装.NET SDK&#xff1a; C#是基于.NET框架的&#xff0c;因此需要安装 .NET SDK。 前往 .NET官网 下载并安装适用于操…

【微信小程序】自定义组件 - 插槽

1. 什么是插槽 2. 单个插槽 在小程序中&#xff0c;默认每个自定义组件中只允许使用一个 进行占位&#xff0c;这种个数上的限制叫做单个插槽。 3. 启用多个插槽 在小程序的自定义组件中&#xff0c;需要使用多 插槽时&#xff0c;可以在组件的 .js 文件中&#xff0c;通过…

数据库之间表的迁移

什么时候用&#xff1f; 相信大家在开发中&#xff0c;会先在本地和测试环境的数据库去建立表&#xff0c;没问题了再去正式环境建立相同的表。或者我们有旧系统和新系统&#xff0c;要把旧系统里面的数据库某个功能的相关的表给导出来&#xff0c;这时候就会发生表的数据迁移…

【网络安全】漏洞挖掘:IDOR实例

未经许可&#xff0c;不得转载。 文章目录 正文 正文 某提交系统&#xff0c;可以选择打印或下载passport。 点击Documents > Download后&#xff0c;应用程序将执行 HTTP GET 请求&#xff1a; /production/api/v1/attachment?id4550381&enamemId123888id为文件id&am…

Vue3 的 expose 介绍

在 Vue 3 中&#xff0c;expose 是一个用于控制组件内部方法和属性暴露给父组件的新功能。这使得父组件可以调用子组件内部的方法或访问其数据&#xff0c;尤其在使用组合式 API&#xff08;Composition API&#xff09;时&#xff0c;这种能力非常有用。 1. 基本用法 expose…