题解 | #判断链表中是否有环#

判断链表中是否有环

http://www.nowcoder.com/practice/650474f313294468a4ded3ce0f7898b9

自己想的时候只想到了用内存去把第一次遇到的数据存起来, 但是题目要求空间复杂度为O(1), 就去百度了一下, 看到了这种通过数学计算的方式去做这件事, 大体可以描述如下:

  1. 定义两个指针,一快一慢,快的叫fast, 慢的叫slow
  2. 慢的每次获取 slow.next 也就是前进一步
  3. 快的每次获取 fast.next.next 也就是前进两步
  4. 假设无环,任意一次前进后发现当前节点没有后续节点说明这是个无环图
  5. 假设有环, fast跑的速度快, slow速度慢, fast回先进环, 假设环有N个节点,fast在环里不断循环,slow也一定会进环
  6. fast 与 slow同时进环,且它俩可处于环内任意位置, slow每次前进一次,fast每次前进两次, 假设 N为奇数,设为3
    slow处于位置2, slow处于位置1, 下次循环slow处于位置2, fast处于1, 再次循环 fast与slow与位置3相遇,以此
    类推任意位置都会遇到, 如果N为偶数,设为4, slow处于位置1,fast处于位置2, 再次移动为 slow位置2, fast位置
    4, slow位置3, fast位置2, slow位置4,fast位置4,相遇, 其他情况全部会在slow小于位置4的时候相遇
  7. 最直接的解释为什么会相遇: 如果同时处于环内,fast比slow快1,每次行动距离会缩减一,最终会追到slow身后,并在下
    次行动后相遇
全部评论

相关推荐

11-07 13:31
怀化学院 Java
勇敢牛牛不怕难:又疯一个
点赞 评论 收藏
分享
11-09 14:54
已编辑
华南农业大学 产品经理
大拿老师:这个简历,连手机号码和照片都没打码,那为什么关键要素求职职位就不写呢? 从上往下看,都没看出自己到底是产品经理的简历,还是电子硬件的简历? 这是一个大问题,当然,更大的问题是实习经历的描述是不对的 不要只是去写实习流程,陈平,怎么去开会?怎么去讨论? 面试问的是你的产品功能点,是怎么设计的?也就是要写项目的亮点,有什么功能?这个功能有什么难处?怎么去解决的? 实习流程大家都一样,没什么优势,也没有提问点,没有提问,你就不得分 另外,你要明确你投的是什么职位,如果投的是产品职位,你的项目经历写的全都是跟产品无关的,那你的简历就没用 你的面试官必然是一个资深的产品经理,他不会去问那些计算机类的编程项目 所以这种四不像的简历,在校招是大忌
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务