[LeetCode系列]链表环探测问题II
给定一个链表头, 探测其是否有环, 如果没有返回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的更多相关文章
- [LeetCode] Linked List Cycle II 链表环起始位置
Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...
- LeetCode 单链表专题 (一)
目录 LeetCode 单链表专题 <c++> \([2]\) Add Two Numbers \([92]\) Reverse Linked List II \([86]\) Parti ...
- leetcode 单链表相关题目汇总
leetcode-19-Remove Nth From End of List—移除链表中倒数第n个元素 leetcode-21-Merge Two Sorted Lists—两个已排序链表归并 ...
- LeetCode之链表总结
链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度.作为一种常用的数据结构,链表内置在很多高级编程语言里面.既比数组复杂又比树简单,所以链表经常被面试官 ...
- 《Mastering Opencv ...读书笔记系列》车牌识别(II)
http://blog.csdn.net/jinshengtao/article/details/17954427 <Mastering Opencv ...读书笔记系列>车牌识别(I ...
- Leetcode解题-链表(2.2.0)基础类
1 基类的作用 在开始练习LeetCode链表部分的习题之前,首先创建好一个Solution基类,其作用就是: Ø 规定好每个子Solution都要实现纯虚函数test做测试: Ø 提供了List ...
- 【Algorithm | 链表】单链表“环”、“环的起点”、“环的长度”问题
参考资料 • Floyd判圈算法 { 链接 } • 单链表“环”.“环的起点”.环的长度”问题 { 链接 } 链表环的问题 一.判断链表有换 使用两个指针slow和fast.两个指针开始时均在头节点处 ...
- [LeetCode] 95. Unique Binary Search Trees II(给定一个数字n,返回所有二叉搜索树) ☆☆☆
Unique Binary Search Trees II leetcode java [LeetCode]Unique Binary Search Trees II 异构二叉查找树II Unique ...
- 【算法题 14 LeetCode 147 链表的插入排序】
算法题 14 LeetCode 147 链表的插入排序: 解题代码: # Definition for singly-linked list. # class ListNode(object): # ...
随机推荐
- LM3S之boot loader学习笔记-1
LM3S之boot loader学习笔记-1 彭会锋 (首先声明,此系列文章编写参考了很多资料,其中一些内容是原版内容的引用和整理,并加入了一些自己的见解,我已经尽量标明引用部分,如有未全部标注部分, ...
- VS的 X64下的汇编编译
参考博客 VS编译64位汇编时报错:error C4235: 使用了非标准扩展: 不支持在此结构上使用“_asm”关键字 在用VS2013编译内联汇编时,报如下错误: 错误 5 error ...
- 常用的SpringMVC注解
1.@RequestMapping() 访问链接编写: 例如: (1).请求方法: 访问链接: (2).请求参数和请求头: 访问链接: 2.@PathVariable 例如: 访问链接: 结果显示: ...
- C++多线程1.createthread
C++ 多线程知识1.多线程入门 CreateThread 20131021 1.介绍WinAPI中的CreateThread 函数原型: HANDLE WINAPI CreateThread( LP ...
- lambda表达式 <二>
概念了解: 1.什么是匿名委托(匿名方法的简单介绍.为什么要用匿名方法) 2.匿名方法的[拉姆达表达式]方法定义 3.匿名方法的调用(匿名方法的参数传递.使用过程中需要注意什么) 什么是匿名方法? 匿 ...
- LeetCode OJ:Merge k Sorted Lists(归并k个链表)
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 类 ...
- 【WebGL】2.基础概念
引入Three.js <!DOCTYPE html> <html> <head> <title></title> </head> ...
- VS2005 使用体验
鄙人记性真心不好,看了就忘.此文记录下日常小工具的tips. 1)VS的小番茄: 破解版 Visual.Assist.X.V10.6.1833支持VS2010 VS2008 VS2005 VC6 破解 ...
- open()参数宏的意义 O_TRUNC
C语言中一些基本函数 int _open(char *pathname,int access)为读或写打开一个文件, 按后按access来确定是读文件还是写文件,access值见下表 ┌──────┬ ...
- [AirFlow]AirFlow使用指南一 安装与启动
1. 安装 通过pip安装: xiaosi@yoona:~$ pip install airflow 如果速度比较慢,可以使用下面提供的源进行安装: xiaosi@yoona:~$ pip insta ...