[LeetCode]LinkedListCycle 和LinkedListCycle2

题目1:

Given a linked list, determine if it has a cycle in it.

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

题目2:

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:快慢指针,查找是否存在环。

思路2:

一个链表中包含环,请找出该链表的环的入口结点。

判断是否包含环:快慢指针,fast的速度是low的2倍。如果存在fast=low,那就存在环。
 找环的入口,则有数学公式:
 设起点到环入口的距离为a,入口到相遇的距离为b,相遇后到入口的距离为c 则因为fast是low的2倍,
 Sfast = a+b+c+b
 Slow = a+b
 Sfast = 2Slow a+b+c+b = 2(a+b) -> c = a
 得到c=a这个结论就好办了,在第一次相遇之后,让fast回到起点,fast和low都每次移动一个单位,
 low走过c距离,fast走过a距离,是一样的,刚好回到环的入口点。

 1 public class LinkedListCycle {
 2     public boolean hasCycle(ListNode head) {
 3         if(head == null) return false;
 4         ListNode fast = head;
 5         ListNode slow = head;
 6         while(fast.next!=null&&fast.next.next!=null){
 7             fast = fast.next.next;
 8             slow = slow.next;
 9             if(fast == slow){
10                 return true;
11             }
12         }
13         return false;
14         
15     }
16 }
 1 public class LinkedListCycle2 {
 2     public ListNode detectCycle(ListNode head) {
 3         
 4         if(head == null || head.next == null){
 5             return null;
 6                 
 7         }
 8         ListNode fast = head;
 9         ListNode low = head;
10         while(fast.next!=null){
11             fast = fast.next.next;
12             low = low.next;
13             
14             if(fast == low){
15                 fast = head;
16                 while(fast!=low){
17                     fast = fast.next;
18                     low = low.next;
19                 }
20                 if(fast == low){
21                     return low;
22                 }
23             }
24         }
25         return null;
26     
27     }
28 }

 

posted @ 2018-07-11 11:11  zlz099  阅读(150)  评论(0编辑  收藏  举报