LeetCode 142. Linked List Cycle II

Posted 皇家大鹏鹏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 142. Linked List Cycle II相关的知识,希望对你有一定的参考价值。

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?

 

这道题和之前那道比较难的链表题目相比,难度略大,不仅仅需要判断出是否有环,而且需要找到环的入口节点,《剑指offer》上给出的解法是:

1、先用双指针判断是否有环,如果没有,返回空指针;如果有,指针停在环中的某个节点

2、让环中的指针开始走,得到环的长度N

3、一个指针指向头部,另一个指针比他快N步,两个一起前进,重合地方就是环的入口节点;

 

但是这里我们采用更简单的方法:

1、 先用双指针判断是否有环,如果没有,返回空指针;如果有,指针停在环中的某个节点,设该节点指针为p1

2、让p2指向head节点,p1和p2一起走,二者重节点就是链表入口节点,证明请参考:http://www.cnblogs.com/hiddenfox/p/3408931.html

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode *detectCycle(ListNode *head) {
12         ListNode *fast = head, *slow = head;
13         while (fast && fast->next)
14         {
15             slow = slow->next;
16             fast = fast->next->next;
17             if (slow == fast)
18                 break;
19         }
20         if (!fast || !fast->next)
21             return nullptr;
22         slow = head;
23         while (slow != fast)
24         {
25             slow = slow->next;
26             fast = fast->next;
27         }
28         return fast;
29     }
30 };

 

以上是关于LeetCode 142. Linked List Cycle II的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode-142-Linked List Cycle II

LeetCode 141, 142. Linked List Cycle I+II

leetcode-142. Linked List Cycle II

LeetCode142. Linked List Cycle II

[LeetCode] 142. Linked List Cycle II

LeetCode 142 Linked List Cycle II