剑指offer 55.链表中环的入口结点

剑指offer 55.链表中环的入口结点

题目

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

思路

现在成了数学题了,首先设快慢两点都在开头,快结点一下走两步,慢结点一下走一步,当快结点追上慢结点就代表存在环。
当二者相遇,快结点回到开头,慢结点继续走,当二者再次相遇时,结点就为环的入口结点。记得要考虑到没有下一个结点的可能性。
数学问题我就不证明了,画一个图就能理解了。

代码

  public class ListNode {

    int val;
    ListNode next = null;

    ListNode(int val) {
      this.val = val;
    }
  }

  public ListNode EntryNodeOfLoop(ListNode pHead) {
    ListNode fast = pHead;
    ListNode slow = pHead;
    while (fast != null && fast.next != null) {
      fast = fast.next.next;
      slow = slow.next;
      if (fast == slow) {
        break;
      }
    }
    if (fast == null || fast.next == null) {
      return null;
    }
    fast = pHead;
    while (fast != slow) {
      fast = fast.next;
      slow = slow.next;
    }
    return fast;
  }
原文地址:https://www.cnblogs.com/blogxjc/p/12422982.html