寻找带环的链表的柄长
试题:
给定一个带环的链表,找出环起点。
比如:A -> B -> C -> D -> E -> C (C为环形起点)
写一个程序找出环起点C。
ListNode结构如下,请实现 ListNode* find_circle_beginning(ListNode* head);函数,返回环的起点。
struct ListNode {char val;ListNode* next; };
答案:
1、先用快指针(每次走两步)和慢指针(每次走一步),遍历链表,当两个指针相遇时,说明该链表存在环。
2、当两个指针遇到时,慢指针退回到链表起点,快指针保留在相遇点,两个指针都以一次一步前进,再次相遇的点就是环的起点。
源码如下:
ListNode* find_circle_beginning(ListNode* head) {if( head == NULL ){return NULL;}ListNode* slow = head;ListNode* fast = head;// 寻找相遇点while( slow != NULL && fast != NULL && fast->next != NULL ){slow = slow->next;fast = fast->next->next;if( fast == slow ){// 在此相遇,说明存在环break;}}// 如果两个指针不等,说明不存在环if( fast != slow ){return NULL;}/*慢指针退回到链表起点,快指针保留在相遇点,两个指针都以一次一步前进,再次相遇的点就是环的起点。稍后会给出证明*/ slow = head;while( slow != fast ){slow = slow->next;fast = fast->next;}return fast; }
证明:
假设环柄长度AB为h,环的长度为p,相遇点为C.
当快指针和慢指针相遇时,慢指针在环上走了m步,总共就是h+m,快指针走过的长度就是2(h+m),在环上走过的长度就是h+2m。在相遇点相遇时,存在以下关系:
(h+2m)%p = m%p
==> ((h+m)+m)%p = m%p
==> (h+m)%p = 0
==> h%p + m%p = p 式(1)
假设BC的长度是m1,则有m%p = m1,带入式(1)得到:
h%p = p - m1
==> h = (p - m1) + ap (a >= 0)
当第二次相遇时,慢指针从头走过h,快指针走(p-m1)+ap,然后在环起点相遇。
小结:
本文的证明实际是倒推的结果。该方法实际上是叫做Pollard's Rho Method,详见http://www.csh.rit.edu/~pat/math/quickies/rho/
转载于:https://www.cnblogs.com/shokey520/p/3812476.html
寻找带环的链表的柄长相关推荐
- 证明利用快慢指针寻找有环单链表中环的起点算法
问题:给定一个有环单链表,找到链表中环的起点,也就是说,找到下图中的单链表中Join点: (本图来源于http://www.cnblogs.com/xudong-bupt/p/3667729.html ...
- 【数据结构与算法】带环单链表查找环的入口算法
带环单链表的故事 @不了解前尘往事的Reader,烦请阅读--<判断单链表是否有环的算法> 如何找带环单链表的环的入口 这里只说比较可行的算法吧. 思路一:HashSet第一个重复元素就是 ...
- 带环单链表求入口节点原理
单链表求环长点击打开链接
- 找出带环单向链表的环入口(交点)
其实这个问题已经被问烂了,但是之前没有想透,今天算是解决得差不多. 找环的入口这个问题,其实是建立在另外一个问题之上的--判断单向链表是否有环 土方法很多,但是比较好的目前就那么一个:一开始设置两个指 ...
- 【神秘海域】[动图] 结合题目-手把手带你剖析 “带环链表”
文章目录 引言 带环单链表之前 : 快慢指针 题1:单链表的中间结点 题2:链表中倒数最后k个结点 带环链表分析 题:环形链表 带环链表的问题 ⭐带环链表深入分析⭐ * 问题1 问题2 问题3 题:寻 ...
- [PHP] 算法-请找出带环链表的环的入口结点的PHP实现
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null1.找链表倒数第k个结点,输入一个链表,输出该链表中倒数第k个结点.第一个指针走(k-1)步,到达第k个节点,两个指针同时往后移 ...
- 链表带环问题(LeetCode 142)
目录 记录算法思路 分析题目 1. 判断链表是否带环 2.链表所带环的起始位置 总结 记录算法思路 在LeetCode上做到了一个有意思的题,思路非常有意思,记录如下 原题链接 环形链表Ⅱ 分析题目 ...
- 【数据结构与算法】判断两个无环单链表是否相交的算法
带环单链表的故事 @不了解前尘往事的Reader,烦请阅读--<判断单链表是否有环的算法> 不过我们这里不考虑带环单链表,且无环单链表相交也只是相交一次,不穿过,这是一种不算复杂的情况吧. ...
- 链表是否带环、环入口、环长度、链表相交问题分析与总结
关于链表的知识总结,参考原博客:http://www.cnblogs.com/hellogiser/p/linked-list-loop-and-intersections.html 一.链表是否带环 ...
最新文章
- Python入门100题 | 第014题
- C++_系列自学课程_第_9_课_C语言风格字符串_《C++ Primer 第四版》
- 两用物项许可证办理流程_办理医疗器械经营许可证流程
- mysql索引统计信息更新_MySQL索引统计信息更新相关的参数
- Ubuntu虚拟机环境下安装Python3.6
- mock SpringMVC 测试控制器方法
- Android自定义弹窗页面,Android编程实现的自定义弹窗(PopupWindow)功能示例
- ipsec在企业网中的应用(IKE野蛮模式)(转)
- 【图像融合】基于matlab CBF算法图像融合【含Matlab源码 083期】
- 根据pid查端口_PLC应用,3个PID控制实例讲解,想不会都难!
- 产品经理技术脑:怎么看懂接口文档
- 健身机构如何入局知识付费?
- 树莓派sensehat画图游戏 Etch a sketch
- 微电子封装技术未来发展面临的问题与挑战
- 什么是图像直方图直方图均衡的原理和作用图像信噪比的概念
- java.sql.SQLSyntaxErrorException: Table 'ph.tbl_user' doesn't exist
- 涉密计算机及网络保密管理制度,威海市国家保密局 保密制度 计算机及网络保密管理制度...
- 夜晚的风,教会了我如何写散文诗
- 反向传播求偏导原理简单理解
- 开式系统管径推荐选型_中央空调水系统管径选型表