给定一个链表头, 探测其是否有环, 如果没有返回NULL, 如果有返回环开始的位置.

环开始的位置定义为被两个指针指向的位置.

算法描述:

1. 快慢指针遍历, 如果到头说明无环返回NULL, 如果相遇说明有环, 进入2.

2. 慢指针回到起点, 快慢指针每次移动一格直到相遇, 返回快指针/慢指针.

代码:

 class Solution {
public:
ListNode *detectCycle(ListNode *head) {
if (!head || !head->next) return NULL;
ListNode *fast = head;
ListNode *slow = head;
while (true) {
if (!fast || !fast->next) return NULL; // no cycle
slow = slow->next;
fast = fast->next->next;
if (slow == fast) break; // has cycle
}
slow = head;
while (slow != fast) {
slow = slow->next;
fast = fast->next;
}
return slow;
}
};

证明: (仅证明有环情况)

我们设非环部分长为D, 环长为C, 快慢指针相遇时慢指针走过的弧长为L

1. 当快慢指针相遇时, 慢指针行进的距离为: D + L

           快指针行进的距离为: D + L + n * C

           由快慢指针性质可以得到: 2(D + L) = D + L + n * C

                        D + L = n * C

                        D = n * C - L

                 所以, 慢指针: n * C

                    快指针: 2 * n * C

2. 把慢指针放回起点, 当慢指针到达环的起点时,

慢指针行进的距离为: D                      

快指针行进的距离为: 2 * n * C + n * C - L

          = 3 * n * C - L

          = 3 * (n-1) * C + (C - L)

即快指针也正好走完剩余的弧长. 到达起点. 证毕.

[LeetCode系列]链表环探测问题II的更多相关文章

  1. [LeetCode] Linked List Cycle II 链表环起始位置

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...

  2. LeetCode 单链表专题 (一)

    目录 LeetCode 单链表专题 <c++> \([2]\) Add Two Numbers \([92]\) Reverse Linked List II \([86]\) Parti ...

  3. leetcode 单链表相关题目汇总

      leetcode-19-Remove Nth From End of List—移除链表中倒数第n个元素 leetcode-21-Merge Two Sorted Lists—两个已排序链表归并 ...

  4. LeetCode之链表总结

    链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度.作为一种常用的数据结构,链表内置在很多高级编程语言里面.既比数组复杂又比树简单,所以链表经常被面试官 ...

  5. 《Mastering Opencv ...读书笔记系列》车牌识别(II)

    http://blog.csdn.net/jinshengtao/article/details/17954427   <Mastering Opencv ...读书笔记系列>车牌识别(I ...

  6. Leetcode解题-链表(2.2.0)基础类

    1 基类的作用 在开始练习LeetCode链表部分的习题之前,首先创建好一个Solution基类,其作用就是: Ø  规定好每个子Solution都要实现纯虚函数test做测试: Ø  提供了List ...

  7. 【Algorithm | 链表】单链表“环”、“环的起点”、“环的长度”问题

    参考资料 • Floyd判圈算法 { 链接 } • 单链表“环”.“环的起点”.环的长度”问题 { 链接 } 链表环的问题 一.判断链表有换 使用两个指针slow和fast.两个指针开始时均在头节点处 ...

  8. [LeetCode] 95. Unique Binary Search Trees II(给定一个数字n,返回所有二叉搜索树) ☆☆☆

    Unique Binary Search Trees II leetcode java [LeetCode]Unique Binary Search Trees II 异构二叉查找树II Unique ...

  9. 【算法题 14 LeetCode 147 链表的插入排序】

    算法题 14 LeetCode 147 链表的插入排序: 解题代码: # Definition for singly-linked list. # class ListNode(object): # ...

随机推荐

  1. linux共享上网设置

    1.打开内核ip转发 vi /etc/sysctl.conf  net.ipv4.ip_forward = 1 执行sysctrl -p生效 2.如果主机未启用防火墙,那么如下设置iptables [ ...

  2. 搞懂分布式技术6:Zookeeper典型应用场景及实践

    搞懂分布式技术6:Zookeeper典型应用场景及实践 一.ZooKeeper典型应用场景实践 ZooKeeper是一个高可用的分布式数据管理与系统协调框架.基于对Paxos算法的实现,使该框架保证了 ...

  3. poj-2342-简单树形dp

    Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10388   Accepted: 594 ...

  4. node-glob 匹配通配符

    1.https://www.cnblogs.com/liulangmao/p/4552339.html 2.https://github.com/isaacs/node-glob 3.https:// ...

  5. iptables(五)iptables匹配条件总结之二(常用扩展模块)

    iprange扩展模块 之前我们已经总结过,在不使用任何扩展模块的情况下,使用-s选项或者-d选项即可匹配报文的源地址与目标地址,而且在指定IP地址时,可以同时指定多个IP地址,每个IP用" ...

  6. 尝试优化骨骼动画计算的意外收获——使用嵌入式汇编对float转int进行优化

    本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/4984530.html 公司引擎目前是使用CPU计算骨骼动画(采用了D3DX提供的函数 ...

  7. 弄懂flex布局

    目前在不考虑IE以及低端安卓机(4.3-)的兼容下,已经可以放心使用flex进行布局了.什么是flex布局以及它的好处,这里就不再赘述. 在这篇文章里,想说说flex布局的属性语法及其细节.那么网上也 ...

  8. OC-字符串、数组、字典总结

    #import <Foundation/Foundation.h> /* ∆以NSMutable开头的都是可变类型,以NSMutable开头定义的对象都是可以对数据进行修改: NSStri ...

  9. java中a++和++a的区别详解

    java中的++操作无论在前还是在后,都是在变量自身的值加1,接下来将具体描述两者的区别 int a =5; int b =a++; System.out.println(b); 1.通俗易懂的理解是 ...

  10. Java反射-初步入门

    Java反射-初步入门 学反射先了解什么是反射. 百度百科:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动 ...