1.如果存在环:(1)设置两个指针,一个步长为1,一个步长为2。如果链表中存在环,那么快的指针一定会追上慢的指针,
而且此时慢指针还没有走完一圈。
(2)此时慢指针到环入口节点的长度与头结点到环入口节点的长度相等。
2.如果不存在环:1中的两个指针不会相等。
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } */ public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) { ListNode slow = pHead; ListNode fast = pHead;
//先要判断slow.next和slow.next.next是否为空。为空说明不存在环返回null。如果这里不判断,对只有一个节点的链表会产生空指异常。 if (pHead == null || pHead.next == null || pHead.next.next == null) { return null; } slow = slow.next; fast = fast.next.next;
//当slow为null或者fast为null或者slow和fast相等时结束循环。 while (slow != null && fast != null && slow != fast) { slow = slow.next; fast = fast.next.next; }
//如果上面的while循环结束时,slow或者fast为null说明不存在环,返回null。 if (slow == null || fast == null) { return null; }else { ListNode temp = pHead;
//从开始节点到环入口节点的长度和fast和slow相遇的节点到环的入口节点的距离相等。它们的步长一次加1,相等的时候就是环的入口节点。 while (temp != slow) { slow = slow.next; temp = temp.next; } return temp; } } }
原文:https://www.cnblogs.com/ofmou/p/13206394.html