热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

快慢指针_快慢指针找链表中的环

本文由编程笔记#小编为大家整理,主要介绍了快慢指针找链表中的环相关的知识,希望对你有一定的参考价值。 
本文由编程笔记#小编为大家整理,主要介绍了快慢指针找链表中的环相关的知识,希望对你有一定的参考价值。



 





一、一定会相遇的证明

1、如果链表没有环,那么快指针比慢指针先到达尾部(null)

2、如果链表有环的话,因为快指针走的比慢指针快,所以在环中相遇的过程可以看作是快指针从环后边追赶慢指针的过程。

用递归法证明,快慢指针一定会相遇:

(1)快指针与慢指针之间差一步。此时继续往后走,慢指针前进一步,快指针前进两步,两者相遇。
(2)快指针与慢指针之间差两步。此时继续往后走,慢指针前进一步,快指针前进两步,两者之间相差一步,转化为第一种情况。
(3)快指针与慢指针之间差N步。此时继续往后走,慢指针前进一步,快指针前进两步,两者之间相差(N+1-2)即N-1步。重复这个过程,直到快指针和慢指针相遇。


因此,此题得证。所以快指针必然与慢指针相遇。


参考:
作者:知乎用户
链接:https://www.zhihu.com/question/23208893/answer/117115415

 

推导:慢指针进入环后,快指针最多多绕一个圈。

快指针F先进环,慢指针S后进。

假设慢指针进环那一刻快指针差m步能追上(0<= m 环),根据上边结论,两个指针走m次就会相遇了。

因为m 环,所以快指针在慢指针进环那一刻最多比慢指针多绕一个圈。

 


二、环长度

快指针和慢指针第一次相遇时的节点pq(碰撞点),快指针和慢指针从该点开始继续往前走,再次碰撞时所用的操作数就是环的长度Length

证明:由上边的推导可得,这里的m为Lengh

 


三、连接点

技术图片

 

假设慢指针进入环中时,即连接点p,快指针(q)需要m步才能追上慢指针。

p和q第一次相遇时,碰撞点在pq处。此时,p走到pq时用了m步。

 假设head到p的距离为a,环长度为Length,慢指针走了s步,则快指针走了2s步。

从上图可知:

s = a + m

2s = a + m + n * Length(n为快指针绕环的圈数)

可得

a = n * Length环 - m

也就是:若在头结点和相遇结点分别设一指针,同步(单步)前进,则最后一定相遇在环入口结点p。

可根据这个结论来找到入口节点。


四、带环链表总长度

找到连接点p后,求head到p的长度,再加上环的长度,即为链表的总长。




推荐阅读
  • 在探索 Unity Shaders 的过程中,我逐渐意识到掌握 OpenGL 基础知识的重要性。本文将详细介绍 OpenGL 的核心概念和基本操作,帮助读者从零开始理解这一图形编程技术。通过实例和代码解析,我们将深入探讨如何利用 OpenGL 创建高效的图形应用。无论你是初学者还是有一定经验的开发者,都能从中受益匪浅。 ... [详细]
  • PAT甲级 1068 寻找更多硬币 (30分) 01背包问题与路径优化
    PAT甲级 1068 寻找更多硬币 (30分) 01背包问题与路径优化 ... [详细]
  • 通过一张截图深入解析字节跳动的 Java 开发实力
    在与一位来自字节跳动的朋友交流时了解到,根据他们近期招聘Java工程师的经验,大多数候选人往往在工作3年后会遇到一个难以跨越的瓶颈期。这是因为在职业生涯的这个阶段,许多工程师的技术深度和广度已经达到了一定的水平,但要进一步提升则需要更多的挑战和学习机会。字节跳动作为一家技术驱动的公司,通过严格的面试流程和实际项目经验,能够更好地评估候选人的技术水平和发展潜力。 ... [详细]
  • 本文将详细介绍如何利用JMeter高效执行API接口测试,涵盖JMeter的基础介绍、安装方法、中文环境配置、主要元件及其作用域和执行顺序等内容,并分享一系列实用的测试技巧,帮助读者全面掌握JMeter接口测试的全过程。 ... [详细]
  • 本文详细解析了RTMP(实时消息传输协议)的中英文规范与标准,提供了中文版和英文版的官方文档链接,便于读者全面了解该协议的技术细节和应用场景。中文版文档地址为:,英文版文档地址为:。通过对比分析,文章深入探讨了RTMP在流媒体传输中的关键特性和优势,帮助技术人员更好地掌握和应用该协议。 ... [详细]
  • Dapper:一款高效轻量的ORM框架
    Dapper 是一个高效且轻量级的 ORM(对象关系映射)框架,由 StackExchange 开发并维护。它旨在提供快速的数据访问性能,同时保持代码的简洁性和易用性。Dapper 可以显著提高开发效率,特别适用于需要高性能数据操作的应用场景。更多详细信息可参考其官方文档和 GitHub 仓库。 ... [详细]
  • 在处理Java程序时,中文乱码是一个常见的问题。本文将详细探讨导致中文乱码的原因,并分享有效的解决方案,帮助开发者在实际工作中避免这一问题。通过具体的代码示例和最佳实践,本文旨在提供全面的指导,确保中文字符在不同环境下的正确显示。 ... [详细]
  • JMeter(六):组件作用范围与执行流程详解
    在《JMeter(六):组件作用范围与执行流程详解》中,我们将深入探讨组件的作用范围及其执行流程。不同于测试计划和线程组,JMeter中的八类可执行组件具有特定的作用域,这些组件在测试过程中发挥着不同的功能。本文将详细解析这些组件的作用范围,并介绍它们在测试执行过程中的具体行为和相互关系。通过本文,读者将能够更好地理解和优化JMeter测试脚本的设计与执行。 ... [详细]
  • 2023年最新教程:使用PHP实现三角形的循环输出 ... [详细]
  • 在编写SQL查询时,常遇到某些语句无法调用别名的问题。这主要是因为SQL和MySQL中的别名机制存在差异所致。为避免类似错误再次发生,本文汇总了相关技术资料,详细解析了别名调用的限制及其背后的原理,提供了实用的解决方案和最佳实践建议。 ... [详细]
  • 本文深入解析了HTML表格与表单元素,特别是图像映射技术的应用。详细介绍了如何利用 `` 标签实现内容的行列对齐,并探讨了 HTML4 中 Flash 的引入及其在网页设计中的应用。通过实例展示了 `` 标签的使用方法,帮助开发者更好地理解和掌握这些核心元素。 ... [详细]
  • Envoy 流量分配策略优化
    在本研究中,我们对Envoy的流量分配策略进行了优化,旨在提高系统的稳定性和性能。实验环境包括一个前端代理服务(Envoy,IP地址为172.31.57.10)和五个后端服务。通过调整Envoy的配置,实现了更高效的流量分发和负载均衡,显著提升了整体系统的响应速度和可靠性。 ... [详细]
  • 在STM8S系列微控制器中,尽管库函数已提供块操作功能,如FLASH_ProgramBlock(),但要实现高效可靠的块操作,还需对相关配置参数进行细致调整。本文详细探讨了这些配置步骤,并结合实际案例分析了FLASH存储操作的关键技术和注意事项,旨在为开发者提供全面的技术指导。 ... [详细]
  • Nginx入门指南:从零开始掌握基础配置与优化技巧
    Nginx入门指南:从零开始掌握基础配置与优化技巧 ... [详细]
  • 如何在C++中定位数组中特定数字的最后一个位置 ... [详细]
author-avatar
手机用户2502913375
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有