Linked List Cycle I 问有没有环
Given a linked list, determine if it has a cycle in it.
Challenge
Follow up:
Can you solve it without using extra space?
Example
Given -21->10->4->5, tail connects to node index 1, return true
public boolean hasCycle(ListNode head) { if (head == null) { return false; } ListNode slow = head; ListNode fast = head.next; while (fast != null && fast.next != null) { if (slow == fast) { return true; } slow = slow.next; fast = fast.next.next; } return false; }
Linked List Cycle II 问环的入口
Given a linked list, return the node where the cycle begins. If there is no cycle, return null
.
Example
Given -21->10->4->5, tail connects to node index 1,返回10
Challenge
Follow up:
Can you solve it without using extra space?
Solution: 当在找环的过程中slow和fast相遇后,第一题直接return true就行了,这题需要找到环的入口。从slow.next到环的入口的距离等于从head到环的入口的距离。
public ListNode detectCycle(ListNode head) { if (head == null) { return null; } ListNode slow = head; ListNode fast = head.next; while (fast != null && fast.next != null && slow != fast) { slow = slow.next; fast = fast.next.next; } if (fast == null || fast.next == null) { return null; } ListNode runner = head; while (runner != slow.next) { runner = runner.next; slow = slow.next; } return runner; }