环形链表II - 142题

83 阅读1分钟

题目链接:142. 环形链表 II - 力扣(LeetCode)

代码地址:LeetCode/src/lianBiao/_142_环形链表II.java · HuaCai/Algorithm - 码云 - 开源中国 (gitee.com)

解题思路: 假设表头到环的起点距离是A,环的起点到快慢指针相遇的距离为B,环的长度减去B剩余的长度为C。暂且以快慢指针相遇时,快指针比慢指针多走了一个环(多走了n个环也是同理)。那么相遇时慢指针走的距离是A+B,快指针走到距离是A+2B+C因为慢指针每次走一步,快指针每次走两步,那么 2(A+B)==A+2B+C,可得 A==C。那么A.next==C.next时,即为环的起点

class Solution142 {
    public ListNode detectCycle(ListNode head) {
        if (head == null) return null;
        ListNode slow = head, fast = head;
        boolean flag = false;
        while (fast.next != null && fast.next.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (slow == fast) {
                flag = true;
                break;
            }
        }
        if (flag) {
            slow = head;
            while (slow != fast) {
                slow = slow.next;
                fast = fast.next;
            }
            return slow;
        }
        return null;
    }
}

时间复杂度:O(n);空间复杂度:O(1)。