LeetCode 142 环形链表II

LeetCode 142 环形链表II

问题描述:
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

快慢指针

  • 快指针每次走两步、慢指针每次走一步
  • 若链表有环,则两指针必然相遇;否则快指针首先指向null
  • 两指针相遇后,将重新用一指针指向链表头,并与慢指针每次走一步
  • 最终两指针相会于环结构的第一个节点

执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:38.9 MB, 在所有 Java 提交中击败了54.95%的用户

public class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode fast = head, slow = head;
        while (true) {
            if (fast == null || fast.next == null) return null;
            fast = fast.next.next;
            slow = slow.next;
            if (fast == slow) break;
        }
        fast = head;
        while (slow != fast) {
            slow = slow.next;
            fast = fast.next;
        }
        return fast;
    }
}
原文地址:https://www.cnblogs.com/CodeSPA/p/13790124.html