题目:
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 }