试题:
给定一个带环的链表,找出环起点。
比如: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

寻找带环的链表的柄长相关推荐

  1. 证明利用快慢指针寻找有环单链表中环的起点算法

    问题:给定一个有环单链表,找到链表中环的起点,也就是说,找到下图中的单链表中Join点: (本图来源于http://www.cnblogs.com/xudong-bupt/p/3667729.html ...

  2. 【数据结构与算法】带环单链表查找环的入口算法

    带环单链表的故事 @不了解前尘往事的Reader,烦请阅读--<判断单链表是否有环的算法> 如何找带环单链表的环的入口 这里只说比较可行的算法吧. 思路一:HashSet第一个重复元素就是 ...

  3. 带环单链表求入口节点原理

    单链表求环长点击打开链接

  4. 找出带环单向链表的环入口(交点)

    其实这个问题已经被问烂了,但是之前没有想透,今天算是解决得差不多. 找环的入口这个问题,其实是建立在另外一个问题之上的--判断单向链表是否有环 土方法很多,但是比较好的目前就那么一个:一开始设置两个指 ...

  5. 【神秘海域】[动图] 结合题目-手把手带你剖析 “带环链表”

    文章目录 引言 带环单链表之前 : 快慢指针 题1:单链表的中间结点 题2:链表中倒数最后k个结点 带环链表分析 题:环形链表 带环链表的问题 ⭐带环链表深入分析⭐ * 问题1 问题2 问题3 题:寻 ...

  6. [PHP] 算法-请找出带环链表的环的入口结点的PHP实现

    给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null1.找链表倒数第k个结点,输入一个链表,输出该链表中倒数第k个结点.第一个指针走(k-1)步,到达第k个节点,两个指针同时往后移 ...

  7. 链表带环问题(LeetCode 142)

    目录 记录算法思路 分析题目 1. 判断链表是否带环 2.链表所带环的起始位置 总结 记录算法思路 在LeetCode上做到了一个有意思的题,思路非常有意思,记录如下 原题链接 环形链表Ⅱ 分析题目 ...

  8. 【数据结构与算法】判断两个无环单链表是否相交的算法

    带环单链表的故事 @不了解前尘往事的Reader,烦请阅读--<判断单链表是否有环的算法> 不过我们这里不考虑带环单链表,且无环单链表相交也只是相交一次,不穿过,这是一种不算复杂的情况吧. ...

  9. 链表是否带环、环入口、环长度、链表相交问题分析与总结

    关于链表的知识总结,参考原博客:http://www.cnblogs.com/hellogiser/p/linked-list-loop-and-intersections.html 一.链表是否带环 ...

最新文章

  1. Python入门100题 | 第014题
  2. C++_系列自学课程_第_9_课_C语言风格字符串_《C++ Primer 第四版》
  3. 两用物项许可证办理流程_办理医疗器械经营许可证流程
  4. mysql索引统计信息更新_MySQL索引统计信息更新相关的参数
  5. Ubuntu虚拟机环境下安装Python3.6
  6. mock SpringMVC 测试控制器方法
  7. Android自定义弹窗页面,Android编程实现的自定义弹窗(PopupWindow)功能示例
  8. ipsec在企业网中的应用(IKE野蛮模式)(转)
  9. 【图像融合】基于matlab CBF算法图像融合【含Matlab源码 083期】
  10. 根据pid查端口_PLC应用,3个PID控制实例讲解,想不会都难!
  11. 产品经理技术脑:怎么看懂接口文档
  12. 健身机构如何入局知识付费?
  13. 树莓派sensehat画图游戏 Etch a sketch
  14. 微电子封装技术未来发展面临的问题与挑战
  15. 什么是图像直方图直方图均衡的原理和作用图像信噪比的概念
  16. java.sql.SQLSyntaxErrorException: Table 'ph.tbl_user' doesn't exist
  17. 涉密计算机及网络保密管理制度,威海市国家保密局 保密制度 计算机及网络保密管理制度...
  18. 夜晚的风,教会了我如何写散文诗
  19. 反向传播求偏导原理简单理解
  20. 开式系统管径推荐选型_中央空调水系统管径选型表

热门文章

  1. 详解LINUX 的DHCP服务
  2. CCNA10月27日战报
  3. Linux curl API 使用 C语言
  4. Windows10 + VS2015 环境下对gdal2.0.1进行64bit编译小结
  5. 不用asp.net MVC,用WebForm照样可以实现MVC(请看最后一句话)
  6. every day english
  7. 网页主动探测工具使用
  8. ppcelerator徐旸:新一代移动互联网技术
  9. 认识 Web.config
  10. 关于jspsmartupload中的各种问题