原题(Medium): 

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

  为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

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

  

思路:

  首先要考虑的就是怎么发现一个链表是否有环,一个比较普遍的解法就是:快慢指针,定义两个指针:一个快指针,快指针每次跨链表的两个节点;一个慢指针,慢指针每次指向下一个节点。如果链表有环,那么两指针迟早会相遇,从而发现有环而结束比遍历,如果没指针,快指针就会到达链表尾部而结束遍历。

  接下来就是难点了,如何找到入环的节点,我们假设入环的节点与链表的首节点距离为a,然后假设入环的节点与快慢指针相遇的那个结点的距离为b,那么在两指针相遇时,我们可以知道快指针走过的距离为a+x圈+b,而慢指针走过的距离为a+y圈+b,且有一个重要的信息就是,在两指针相遇时,快指针走过的距离是慢指针的两倍。就是说a+x+b  = 2(a+y+b) 还有一个条件就是快指针比慢指针多走的路程一定是环长的整数倍(假设是n倍),这是肯定的,因为a的长度两个节点都会走,那么快指针比慢指针多出来的长度就是快的比慢的多走很多圈,即2(a+y+b)  - (a+y+b)  = a+b+y圈 = n 圈:入环节点与链表的首节点距离(a)+入环节点到相遇点之间的距离(b)是环的整数倍(n - y圈),现在我们知道两个指针都在离入环节点距离为b的那个相遇点,而现在a+b是环长度的整数倍,就是说如果慢指针再走a步,就等于慢指针再走了一次a+b的路程,(1圈也好,n圈也好,都是)回到了入环结点的位置,但是问题是,我们不知道a是多少啊?

  我们可以再定义一个指针指向首节点,该指针走a步的同时慢指针也走a步,两者就相遇啦,相遇的节点就是入环节点。

 ListNode *detectCycle(ListNode *head) {
if (head == NULL) return NULL;
ListNode* fast = head;
ListNode* slow = head;
bool hasCycle = false;
//首先,快慢指针判断是否有环
while (fast&& fast->next != NULL)
{
fast = fast->next->next;
slow = slow->next;
if (fast == slow)
{
hasCycle = true;
break;
}
}
//没环,结束
if (!hasCycle) return NULL;
//有环,两指针同时走,必在a步后相遇,相遇点为入环节点
ListNode* q = head;
while (q != slow)
{
q = q->next;
slow = slow->next;
}
return q;
}

LeetCode | 142. 环形链表 II的更多相关文章

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

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

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

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

  3. Leetcode 142.环形链表II

    环形链表II 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 说明:不允许修改给定的链表. 进阶:你是否可以不用额外空间解决此题? 链表头是X,环的第一个节点是Y,sl ...

  4. LeetCode 142——环形链表 II

    1. 题目 2. 解答 2.1 方法 1 定义快慢两个指针,慢指针每次前进一步,快指针每次前进两步,若链表有环,则快慢指针一定会相遇. 当快慢指针相遇时,我们让慢指针指向头节点,快指针不变,然后每次快 ...

  5. LeetCode 142——环形链表II(JAVA)

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

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

    题目描述 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 说明:不允许修改给定的链表. 进阶: 你是否可以不用额外空间解决此题? 解题思路 分为三步: 首先判断是否存在 ...

  7. leetcode 142. 环形链表 II(c++)

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

  8. 【LeetCode】142. 环形链表 II

    142. 环形链表 II 知识点:链表:set:快慢指针 题目描述 给定一个链表,判断链表中是否有环. 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表 ...

  9. Leetcode.142-Linked-list-cycle-ii(环形链表II)

    环形链表II 思路 https://www.cnblogs.com/springfor/p/3862125.html https://blog.csdn.net/u010292561/article/ ...

随机推荐

  1. K-Nearest Neighbors Algorithm

    K近邻算法. KNN算法非常简单,非常有效.KNN算法适合样本较少典型性较好的样本集. KNN的模型表示是整个训练数据集.也可以说是:KNN的特点是完全跟着数据走,没有数学模型可言. 对一个新的数据点 ...

  2. 认识Dump文件

    一.什么是Dump文件 又叫内存转储文件或者叫内存快照文件.是一个进程或系统在某一给定的时间的快照.比如在进程崩溃时或则进程有其他问题时,甚至是任何时候,我们都可以通过工具将系统或某进程的内存备份出来 ...

  3. [CSP-S 2019]格雷码

    [CSP-S 2019]格雷码 题目大意: 格雷码(Gray Code)是一种特殊的 \(n\) 位二进制串排列法,它要求相邻的两个二进制串间恰好有一位不同,特别地,第一个串与最后一个串也算作相邻. ...

  4. 洛谷 P2212 [USACO14MAR]浇地Watering the Fields 题解

    P2212 [USACO14MAR]浇地Watering the Fields 题目描述 Due to a lack of rain, Farmer John wants to build an ir ...

  5. SIGIR2018 Paper Abstract Reading Notes (1)

    1.A Click Sequence Model for Web Search(日志分析) 更好的理解用户行为对于推动信息检索系统来说是非常重要的.已有的研究工作仅仅关注于建模和预测一次交互行为,例如 ...

  6. 【JZOJ6226】【20190618】纳什均衡

    题目 一颗二叉树,每个点儿子个数为0 或 2 ,对每个叶子有一个权值\((c(u),d(u))\) 从根结点开始走,Alice 可以选择奇数层的走法,Bob 可以选择偶数层的走法,分别获得最后走到叶子 ...

  7. linux命令之------Chmod命令

    Chmod命令 1)作用:linux和unix的文件调用权限分为三级:文件拥有者/群组/其他.利用chmod可以控制文件如何被他人所调用.(主要就是修改文件夹,文件的权限) 2)U表示该文件的拥有者, ...

  8. RESTFull开发风格

  9. 解析.msh或.cas文件

    代码如下:

  10. Spark2.x(六十):在Structured Streaming流处理中是如何查找kafka的DataSourceProvider?

    本章节根据源代码分析Spark Structured Streaming(Spark2.4)在进行DataSourceProvider查找的流程,首先,我们看下读取流数据源kafka的代码: Spar ...