返回

剑指 Offer 16:链表中环的入口节点

前端

剑指 Offer 16:链表中环的入口节点

题目
给定一个链表,如果其中包含环,请找出该链表的环的入口结点,否则,输出null。

思路:

  1. 快慢指针法:使用快慢两个指针来遍历链表,快指针每次移动两步,慢指针每次移动一步。如果存在环,那么快慢指针最终会相遇。
  2. 相遇后,将慢指针从头开始重新遍历链表,快指针保持不变。当快慢指针再次相遇时,相遇的点就是环的入口结点。

代码:

  public ListNode detectCycle(ListNode head) {
      if (head == null || head.next == null) {
          return null;
      }
      ListNode slow = head;
      ListNode fast = head;
      while (fast != null && fast.next != null) {
          slow = slow.next;
          fast = fast.next.next;
          if (slow == fast) {
              break;
          }
      }
      if (slow != fast) {
          return null;
      }
      slow = head;
      while (slow != fast) {
          slow = slow.next;
          fast = fast.next;
      }
      return slow;
  }

时间复杂度:O(n),其中n是链表的长度。

空间复杂度:O(1)。

参考资料: