这是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. C - AtCoDeerくんと選挙速報 / AtCoDeer and Election Report

    ceil有毒啊..用ceil一直错. 思路就是模拟吧,设当前的答案是ansx和ansy. 如果比例是小于ansx的,那么就要乘以一个倍数k1,使得a * k1 >= ansx的. 所以就用cei ...

  2. pom文件jar包缺失问题

    一般情况,不在中央仓库的jar包,比如自己的版本,要用的话打入maven私服 在eclipse中引入其他项目(包含jar包),类似于放入了私服,删除工程源文件,会导致别的工程引用此jar包失效

  3. csrf攻击实例

    CSRF 攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在并未授权的情况下执行在权限保护之下的操作.比如说,受害者 Bob 在银行有一笔存款,通过对银行的网站发送请求 ht ...

  4. 用canvas裁剪图片

    var selectObj = null; function ImageCrop(canvasId, imageSource, x, y, width, height) { var canvas = ...

  5. iOS VIPER架构(三)

    路由是实现模块间解耦的一个有效工具.如果要进行组件化开发,路由是必不可少的一部分.目前iOS上绝大部分的路由工具都是基于URL匹配的,优缺点都很明显.这篇文章里将会给出一个更加原生和安全的设计,这个设 ...

  6. 【extjs6学习笔记】1.3 初始:根据模板创建项目

    使用sencha创建应用 命令说明:sencha -sdk /path/to/sdk generate app -s /your/templates/path/ MyApp /path/to/myap ...

  7. 链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "Cannot start more transactions on this session."

    开发同事反馈一个SQL Server存储过程执行的时候,报"链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 ...

  8. Linux上通过MySQL命令访问MySQL数据库时常见问题汇总

    Linux上通过mysql命令访问MySQL数据库时常见问题汇总 1)创建登录账号 #创建用户并授权 #允许本地访问 create user 'test'@'localhost' identified ...

  9. FZU 2204 7

    题意: n个有标号的球围成一个圈.每个球有两种颜色可以选择黑或白染色.问有多少种方案使得没有出现连续白球7个或连续黑球7个? 思路: 如果出现连续的8,9...个球同色,那么也必定含有7个同色.需要统 ...

  10. Ruby中访问控制符public,private,protected区别总结

    重点关注private与protected public 默认即为public,全局都可以访问,这个不解释 private C++, “private” 意为 “private to this cla ...