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

leetcode---环形链表(快慢指针证明)

问题描述

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

如果链表中存在环,则返回 true 。 否则,返回 false 。请用O(1)的时间复杂度解决

示例 1【输入:head = [3,2,0,-4], pos = 1输出:true】    解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:【输入:head = [1,2], pos = 0输出:true】    解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:【输入:head = [1], pos = -1输出:false】    解释:链表中没有环。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/linked-list-cycle

解题思路

快慢指针法。两个指针slow和fast,开始时两个均指向链表表头,快指针一次走两个节点,慢指针一次走两个节点。如果,fast == slow则证明有环,如果fast == NULL || fast->next == NULL,则证明没有环

问题1:为什么如果有环fast一定会等于slow?

证明:

根据题目可知,fast一定比slow提前进入环,假定当slow进入环时fast在环中的位置如图所示:

当fast和slow都进入环时,fast每次走两步slow每次走一步,slow每走一步fast离slow的距离就会缩短一个节点,直至它们的距离为0时定会相遇。

注意:当slow和fast任意一个在环外时,两个是不会相遇的,因此必须两个都在环内才能比较。

问题2:快指针一次走3个节点是否可以?四个呢?...N个呢?

不可以。无论是3个还是4个更或者是N个,slow每走一步fast相应的会走2,3,...N-1步,这样就可能导致fast每次都会和slow错开永远不会相遇。

代码描述

bool hasCycle(struct ListNode *head) {
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    //当fast为空或者fast->next为空时,链表无环
    while(fast && fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
        if(slow == fast)
            return true;
    }
    return false;
}


 

相关文章:

  • leetcode---环形链表II
  • 剑指offer---复制带随机值的链表
  • Linux---进程概念
  • 数据结构---顺序表和链表
  • C语言课程设计---诗歌管理系统
  • 数据结构---栈和队列(栈、队列、循环队列)
  • leetcode---用两个栈实现队列
  • leetcode---用队列实现栈
  • 数据结构---堆的构建和堆排序(向下、向上调整算法)
  • Linux---进程间通信
  • LeetCode---交换链表中的节点
  • leetcode---数组中重复的数字(非常牛逼的置换算法)、原地置换算法排序
  • 数据结构---二叉树(树和二叉树的基本概念、堆的概念和堆的实现、堆排序、二叉树的顺序和链式结构及其实现、相关面试题解析)
  • leetcode---单值二叉树(递归遍历二叉树)
  • c语言不同数据类型之间的运算(隐式转换、整型提升、强制类型转换、不同类型之间的运算)
  • 《剑指offer》分解让复杂问题更简单
  • 《深入 React 技术栈》
  • CentOS7 安装JDK
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Date型的使用
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • JavaScript 奇技淫巧
  • JS基础之数据类型、对象、原型、原型链、继承
  • Python学习笔记 字符串拼接
  • Python学习之路16-使用API
  • react-native 安卓真机环境搭建
  • scala基础语法(二)
  • Vue--数据传输
  • 从零开始的无人驾驶 1
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 基于axios的vue插件,让http请求更简单
  • 力扣(LeetCode)56
  • 三栏布局总结
  • 线性表及其算法(java实现)
  • 优化 Vue 项目编译文件大小
  • 正则与JS中的正则
  • 【云吞铺子】性能抖动剖析(二)
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • Prometheus VS InfluxDB
  • puppet连载22:define用法
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​flutter 代码混淆
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $.ajax()参数及用法
  • ()、[]、{}、(())、[[]]命令替换
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (初研) Sentence-embedding fine-tune notebook
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (篇九)MySQL常用内置函数
  • (十六)Flask之蓝图
  • (五)IO流之ByteArrayInput/OutputStream
  • (一)python发送HTTP 请求的两种方式(get和post )