Linked List Cycle leetcode II java (寻找链表环的入口)

题目

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

Follow up:
Can you solve it without using extra space?

题解

这个连同I都是很经典的题啦,刷CC150时候就折磨了半天。

其实就推几个递推公式就好。。首先看图(图引用自CC150):

从链表起始处到环入口长度为:a,从环入口到Faster和Slower相遇点长度为:x,整个环长为:c。

明确了以上信息,就可以开始做运算了。。

假设从开始到相遇,Slower走过的路程长为s,由于Faster的步速是Slower的2倍,那么Faster在这段时间走的路程长为2s。

而对于Faster来说,他走的路程还等于之前绕整个环跑的n圈的路程nc,加上最后这一次遇见Slower的路程s。

所以我们有:

2s = nc + s

对于Slower来说,他走的路程长度s还等于他从链表起始处到相遇点的距离,所以有:

s = a + x

通过以上两个式子代入化简有:

a + x = nc

a = nc - x

a = (n-1)c + c-x

a = kc + (c-x)

那么可以看出,c-x,就是从相遇点继续走回到环入口的距离。上面整个式子可以看出,如果此时有个pointer1从起始点出发并且同时还有个pointer2从相遇点出发继续往前走(都只迈一步),那么绕过k圈以后, pointer2会和pointer1在环入口相遇。这样,换入口就找到了。

Reference: http://blog.csdn.net/xiaxia__/article/details/19356861

代码如下:

1     public ListNode detectCycle(ListNode head) {
 2         if(head==null||head.next==null)
 3             return null;
 4         
 5         ListNode fast = head,slow=head;
 6         while (true) {
 7             if (fast == null || fast.next == null) {
 8             return null;   
 9         }
10             slow = slow.next;
11             fast = fast.next.next;
12             
13             if(fast==slow)
14                 break;
15         }
16         
17         slow = head;//slow back to start point
18         while(slow != fast){
19             slow = slow.next;
20             fast = fast.next;
21         }
22         return slow; //when slow == fast, it is where cycle begins
23     }

Linked List Cycle leetcode II java (寻找链表环的入口)

时间: 2024-10-13 22:21:39

Linked List Cycle leetcode II java (寻找链表环的入口)的相关文章

Linked List Cycle leetcode java (链表检测环)

题目: Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using extra space? 题解: 这道题连带着II是很经典的,在看CC150时候,纠结这个问题纠结了很久.在读了很多网上资料还有书的讲解以及和别人讨论之后,对这个专题终于明白了. 这一问只需要判断链表是否有环. 当链表没有环时是很好判断的,让一个指针一直往后走,遇见null了自然就没有环. 而如

《剑指offer》:[37]如何得到链表环的入口地址

题目:如何得到链表环的入口结点 方案:分两步走: 第一步:先要找到链表中的环,得到环的结点的个数.可以设置两个指针一个走的比较快,一个比较慢,那么如果链表中存在一个环,那么这两个指针一定会陷入这个环中,快的指针一定会遇到慢的指针,所以很快就能遇到.因为前面有详细讲过,这里不再多介绍,给一张图吧. 第二步:得到环的个数以后,我们照样可以设置两个指针.第一个指针先前进N(N为环中结点的个数)步,然后和第二个指针以相同的速度前进,当它们相遇时的结点就是链表中环的入口. 具体过程如下图所示: 具体实现代

[Leetcode][JAVA] Linked List Cycle I && II

Linked List Cycle Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using extra space? 使用快慢指针,如果有循环两指针必定能相遇: 1 public boolean hasCycle(ListNode head) { 2 if(head==null) 3 return false; 4 ListNode slow = head;

怎么判断链表有环,怎么判断链表环的入口

来自http://blog.csdn.net/wuzhekai1985/article/details/6725263 ---------------------- 问题1,如何判断链表中是否存在环?即上图中从E到R组成的环? 设slow/fast两个指针,同时从链表起点开始,其中快指针fast每次移动长度为2,slow每次移动一个.如果无环,开始遍历之后fast不可能与slow重合,且fast或fast->next最终必然到达null; 如果有环,那么fast必然不迟于slow先到达环,且由于

LeetCode: Linked List Cycle I && II

I title: Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using extra space? 思路: 使用两个指针slow,fast.两个指针都从表头开始走,slow每次走一步,fast每次走两步,如果fast遇到null,则说明没有环,返回false:如果slow==fast,说明有环,并且此时fast超了slow一圈,返回true. 为什么有环的情况

LeetCode 141, 142. Linked List Cycle I+II

判断链表有没有环,用Floyd Cycle Detection算法,用两个快慢指针. class Solution { public: bool hasCycle(ListNode *head) { if (!head) return false; ListNode *slow, *fast; slow=fast=head; do{ if (fast==NULL || fast->next==NULL) return false; slow = slow->next; fast = fast-

Linked List Cycle——LeetCode

Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using extra space? 题目大意:给定一个链表,判断是否有环? 解题思路: 解法一:快慢指针,如果有环,那么快慢指针总会相遇,有环:否则快的遍历完整个链表,无环. 解法二:HashSet保存节点,如果下一个节点在set中出现过,那么有环,否则直到遍历完整个链表,无环. Talk is cheap>>

Linked List Cycle [leetcode]

#include<iostream> #include<string> #include<fstream> using namespace std; struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public: bool hasCycle(ListNode *head) { ListNode* fast_walk

leetcode链表--6、linked-list-cycle-ii(有环单链表环的入口结点)

题目描述 Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull. Follow up: Can you solve it without using extra space? 解题思路: 1.确定环中结点的数目(快慢指针确定环中结点,然后遍历到下一次到该节点确定数目n) 2.一个指针先走n步,一个指针指向头结点 3.然后两个指针一起走 4.相遇点为入口点 1 /*