这是LeetCode里的第142道题。

题目要求:

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

说明:不允许修改给定的链表。

进阶:你是否可以不用额外空间解决此题?

起初我在做这道题的时候,以为挺简单的,以为循环链表都是已头节点为循环头,结果。。。

~~~~(>_<)~~~~

没考虑到链中任一个节点都可能是循环头的头节点。

一开始比较贪心,就只设置的一个指针p来判断是否循环,结果思考不充分,没考虑到第二种特殊的情况,导致错了很多次。

然后经过多次测试后终于成功了!  (^-^)V

设计思路:

定义两个指针,分别为fast,slow;一个走的快,一个走的慢。其中fast指向head的下一个节点,slow指向head。

然后循环,因为fast和slow速度不同,故直到fast和slow指向同一个节点时退出循环。

而循环次数加1就是循环链的长度,而且此时slow和fast所指向的节点位置与头节点位置的距离刚好也是循环链的长度。

既然这样,考虑到最后的节点一定在循环链之中,那就把fast往前提指向head,然后fast和slow都向后移,直到相等时,返回fast指针。

贴下自己的代码:

注意:这个代码只能在LeetCode运行!不要直接复制粘贴到编译器!

  /**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*//这以上都是LeetCode里的LinkNode结构体定义
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
if (head == NULL || head->next == NULL)//判断链表是否为空或者是只有一个节点
return NULL;
ListNode *slow = head;//slow指针,一步一格
ListNode *fast = head->next;//fast指针,一步两格
while (fast!=NULL&&fast->next!=NULL&&fast->next->next!=NULL) {//这里的条件挺奇怪的???
if (fast == slow)
break;
fast = fast->next->next;
slow = slow->next;
}
fast = head;
slow=slow->next;
while(slow!=fast){
if(slow->next==NULL||fast->next==NULL)//防止链表任然可能不是循环链表
return NULL;
slow=slow->next;
fast=fast->next;
}
return fast;
}
};

运行结果:

其实第16行的循环条件改为:fast==NULL||fast->next==NULL||fast->next->next==NULL,就会:

?????超时???

-------------------------------------------------------------------------------------------------------

然后上网找了找其他的资料来试着对照一下:

初始化slow指针指向head节点,fast指向head->next节点,假设slow与fast在c点相遇。由于slow走过的路程为x+y,fast走过的路程为x+y+z+y,且fast走过的距离是slow的两倍,所以:

2(x+y)=x+y+z+y

化简得x=z

附上地址:https://blog.csdn.net/qq_26410101/article/details/80430411

【LeetCode】Linked List Cycle II(环形链表 II)的更多相关文章

  1. leetcode 142. Linked List Cycle II 环形链表 II

    一.题目大意 https://leetcode.cn/problems/linked-list-cycle-ii/ 给定一个链表的头节点  head ,返回链表开始入环的第一个节点. 如果链表无环,则 ...

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

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

  3. 142 Linked List Cycle II 环形链表 II

    给一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null.说明:不应修改给定的链表.补充:你是否可以不用额外空间解决此题?详见:https://leetcode.com/proble ...

  4. 力扣——Linked List Cycle(环形链表) python实现

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

  5. 打败算法 —— 环形链表 II

    本文参考 出自LeetCode上的题库 -- 环形链表II,哈希表和快慢指针两种解法都需要O(n)的时间,但快慢指针仅占用O(1)的空间 https://leetcode-cn.com/problem ...

  6. LeetCode 142. 环形链表 II(Linked List Cycle II)

    142. 环形链表 II 142. Linked List Cycle II 题目描述 给定一个链表,返回链表开始入环的第一个节点.如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整 ...

  7. LeetCode Linked List Cycle II 和I 通用算法和优化算法

    Linked List Cycle II Given a linked list, return the node where the cycle begins. If there is no cyc ...

  8. Java实现 LeetCode 142 环形链表 II(二)

    142. 环形链表 II 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始 ...

  9. 【算法训练营day4】LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表II

    [算法训练营day4]LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表 ...

随机推荐

  1. linux批量替换指定文件夹中所有文件的指定内容

    命令:sed -i "s#https#http#g" `grep http -rl VEROMODA` 功能:用来替换当前目录VEROMODA文件夹及子文件夹中所有文件中的http ...

  2. ADC中的滤波算法

    STM32的AD最大输入时钟不超过14MHZ,最高采样速度1us,可以采用DMA或者内部的基本定时器/高级定时器来触发,利用模拟看门狗监控所选择的的所有通道,如果超过模拟的 阀[fá] 值,将产生中断 ...

  3. 博弈论 && 题目

    终于我也开始学博弈了,说了几个月,现在才学.学多点套路,不深学.(~~) 参考刘汝佳蓝书p132 nim游戏: 假设是两维的取石子游戏,每次可以在任意一堆拿任意数量个(至少一根,因为这样游戏的状态集有 ...

  4. (转)启动网卡报错(Failed to start LSB: Bring up/down networking )解决办法总结

    启动网卡报错(Failed to start LSB: Bring up/down networking )解决办法总结 原文:http://blog.51cto.com/11863547/19059 ...

  5. Spark Mllib里的分布式矩阵(行矩阵、带有行索引的行矩阵、坐标矩阵和块矩阵概念、构成)(图文详解)

    不多说,直接上干货! Distributed  matrix : 分布式矩阵 一般能采用分布式矩阵,说明这数据存储下来,量还是有一定的.在Spark Mllib里,提供了四种分布式矩阵存储形式,均由支 ...

  6. Appium基础四:Desired Capabilities详讲

    Desired Capabilities在启动session的时候是必须提供的,先看如下代码: Desired Capabilities本质上是key value的对象,他告诉appium serve ...

  7. ios 各种锁的使用性能比较

    iOS开发中常用的锁有如下几种 来比较一下遇到加锁的情况: 1. @synchronized 关键字加锁 2. NSLock 对象锁 3. NSCondition  4. NSConditionLoc ...

  8. Garmin APP开发之布局

    上一章节介绍了garmin app开发的入门,包括garmin-sdk,开发工具的安装部署,文章结尾我们新建了我们的第一个app程序Garmin开发-入门: http://tieba.baidu.co ...

  9. django之session配置

    session应用示例 from django.shortcuts import render from django.shortcuts import HttpResponse from djang ...

  10. jsp页面file标签上传图片以及blob类型数据库存取。

    我的jsp页面表单如下: <form name="form1" action="/YiQu/AddUserServlet?jurisdiction=1" ...