Linked List Cycle I & II

题目:

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

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

思路: 

We can use two pointers: walker and runner. walker move one step at a time. runner move two steps. If there is a cycle, walker and runner will keep running in the cycle. And runner will catch up walker at last.

 1     public boolean hasCycle(ListNode head) {
 2         if (head == null || head.next == null) {
 3             return false;
 4         }
 5         ListNode walker = head;
 6         ListNode runner = head.next;
 7         while (runner != null && runner.next != null) {
 8             if (walker.val == runner.val) {
 9                 return true;
10             }
11             walker = walker.next;
12             runner = runner.next.next;
13         }
14         return false;
15     }

 For Linked List Cycle II, I have a solution, but have no idea why it is not working....Any idea?

 1     public ListNode detectCycle(ListNode head) {
 2         if (head == null) {
 3             return null;
 4         }
 5         ListNode walker = head;
 6         ListNode runner = head;
 7         ListNode meet = null;
 8         
 9         while (runner != null && runner.next != null) {
10             walker = walker.next;
11             runner = runner.next.next;
12             
13             if (runner == walker) {
14                 meet = walker;
15                 break;
16             }
17         }
18         
19         if (meet == null) {
20             return null;
21         }
22         
23         walker = head;
24         while (true) {
25             if (runner == walker) {
26                 return walker;
27             }
28             runner = runner.next;
29             walker = walker.next;
30         }
31     }
原文地址:https://www.cnblogs.com/gonuts/p/4464810.html