Given a linked list, determine if it has a cycle in it.

Follow up:

Can you solve it without using extra space?

分析:

假设有环?遍历链表将无法走完,假设无环终会走到尾为NULL的位置

让一个指针每次走一个,一个指针每次走两个位置。

假设当中一个为NULL则无环。

假设相遇(必会相遇)了则有环。

time,o(n),space,o(1)

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/ class Solution {
public:
bool hasCycle(ListNode *head) {
if(head==NULL)
return false;
ListNode *showNode=head;
ListNode *fastNode=head;
while(true)
{
if(showNode->next!=NULL)
showNode=showNode->next;
else
return false;
if(fastNode->next!=NULL && fastNode->next->next!=NULL)
fastNode=fastNode->next->next;
else
return false;
if(showNode==fastNode)
return true;
}
return false;
}
};

别人的简洁算法:一样的思路

class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode *slow=head,*fast=head;
while(slow&&fast&&fast->next){
slow=slow->next; //跑的慢
fast=fast->next->next; //跑的快
if(slow==fast) return true; //相遇则有环
}
return false;
}
};

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

Note: Do not modify the linked list.

Follow up:

Can you solve it without using extra space?

分析:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="border:none; max-width:100%">

1). 使用快慢指针法,若链表中有环,能够得到两指针的交点M
2). 记链表的头节点为H,环的起点为E 2.1) L1为H到E的距离
2.2) L2为从E出发,首次到达M时的路程
2.3) C为环的周长
2.3) n为快指针在环中所绕圈数 依据L1,L2和C的定义,我们能够得到:
慢指针行进的距离为L1 + L2
快指针行进的距离为L1 + L2 + n*C 因为快慢指针行进的距离有2倍关系,因此:
2 * (L1+L2) = L1 + L2 + n*C => L1 + L2 = n*C => L1 = (n-1)*C+ C - L2
能够推出H到E的距离 = 从M出发绕n-1圈后到达E时的路程
因此,当快慢指针在环中相遇时,我们再令一个慢指针从头节点出发
接下来当两个慢指针相遇时,即为E所在的位置
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode *slow=head,*fast=head;
while(slow && fast && fast->next){
slow=slow->next; //跑的慢
fast=fast->next->next; //跑的快
if(slow==fast) break; //相遇则有环
}
if(fast==NULL || fast->next==NULL)
return NULL; fast=head;
while(slow != fast){
slow=slow->next; //一样的速度跑
fast=fast->next;
}
return slow;
}
};

注:本博文为EbowTang原创,兴许可能继续更新本文。

假设转载。请务必复制本条信息!

原文地址:http://blog.csdn.net/ebowtang/article/details/50507131

原作者博客:http://blog.csdn.net/ebowtang

本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895

<LeetCode OJ> 141 / 142 Linked List Cycle(I / II)的更多相关文章

  1. [LC]141题 Linked List Cycle (环形链表)(链表)

    ①中文题目 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. 示例 ...

  2. [LeetCode] 141&142 Linked List Cycle I & II

    Problem: Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without ...

  3. leetcode 141 142. Linked List Cycle

    题目描述: 不用辅助空间判断,链表中是否有环 /** * Definition for singly-linked list. * struct ListNode { * int val; * Lis ...

  4. LeetCode 141. Linked List Cycle (链表循环)

    Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...

  5. LeetCode OJ:Linked List Cycle(链表循环)

    Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...

  6. LeetCode算法题-Linked List Cycle(Java实现)

    这是悦乐书的第176次更新,第178篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第35题(顺位题号是141).给定一个链表,确定它是否有一个循环. 本次解题使用的开发工 ...

  7. <LeetCode OJ> 26 / 264 / 313 Ugly Number (I / II / III)

    Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers ...

  8. LeetCode OJ:Maximum Depth of Binary Tree(二叉树最大深度)

    Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...

  9. Linked List Cycle(链表成环)

    判断链表中是否有环 来源:https://leetcode.com/problems/linked-list-cycle Given a linked list, determine if it ha ...

随机推荐

  1. Eclipse 无法查看第三方jar包文件源代码解决方法

    1.打开第三方依赖包,源文件的快捷键:ctrl + mouseClick 2.由于我们下载的第三方jar 包,如Spring等相关的依赖包时,并没有附加下载相应的源文件,所以经常出现如图的这种问题. ...

  2. MYSQL重复记录排除法处理方式

    SELECT tmp.user_id, tmp.course_id, tmp.type, tmp.expire_time, @rownum := @rownum + 1, IF ( @course_i ...

  3. Javascript&Html-弹出窗口的屏蔽程序

    大多数的浏览器都内置了弹出窗口的屏蔽程序,即使没有内置此类屏蔽程序的浏览器,用户也可以安装Yahoo tool等带有内置屏蔽程序的应用工具. 结果就是用户可以将绝大多数弹出窗口屏蔽掉. 于是,再弹出窗 ...

  4. Some lines about EF Code First migration.

    Some lines about EF Code First migration: 一. 模型设计 1. 遵循EF标准,注意表关系配对 2. 数据模型里尽量把必须的属性和说明都写全 3. EF默认id ...

  5. java中的序列化与反序列化,还包括将多个对象序列化到一个文件中

    package Serialize; /** * Created by hu on 2015/11/7. */ //实现序列化必须实现的接口,这就是一个空接口,起到标识的作用 import java. ...

  6. Codeforces Round #441 Div. 2 A B C D

    题目链接 A. Trip for Meal 题意 三个点之间两两有路径,分别长为\(a,b,c\),现在从第一个点出发,走\(n-1\)条边,问总路径最小值. 思路 记起始点相邻的边为\(a,b\), ...

  7. Berkeley DB使用SecondKey给数据排序的实现方法

    Berkeley DB使用SecondKey给数据排序的 实现方法是本文我们主要要介绍的内容,在做项目的时候用到了nosql数据库BDB,借此机会研究了一下它的用法.它的官方示例和文档比较丰富,感觉比 ...

  8. pyqt线程实现

    # coding=utf-8 __author__ = 'a359680405' from PyQt5.QtCore import * from PyQt5.QtGui import * from P ...

  9. Day 21 Object_oriented_programming_2

    继承实现原理 python中的类可以同时继承多个父类,继承的顺序有两种:深度优先和广度优先. 一般来讲,经典类在多继承的情况下会按照深度优先的方式查找,新式类会按照广度优先的方式查找 示例解析: 没有 ...

  10. centos 7 安装golang1.12.5

    本文主要介绍服务器端环境配置,开发环境是window的话可以参考 https://www.cnblogs.com/nickchou/p/10765743.html 方式一.用yum安装 1.用yum指 ...