剑指offer——判断链表中是否有环

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

解题思路:

//左神讲的
//先说个定理:两个指针一个fast、一个slow同时从一个链表的头部出发
//fast一次走2步,slow一次走一步,如果该链表有环,两个指针必然在环内相遇
//此时只需要把其中的一个指针重新指向链表头部,另一个不变(还在环内),
//这次两个指针一次走一步,相遇的地方就是入口节点。
//这个定理可以自己去网上看看证明。
 
 1 /*
 2  public class ListNode {
 3     int val;
 4     ListNode next = null;
 5 
 6     ListNode(int val) {
 7         this.val = val;
 8     }
 9 }
10 */
11 public class Solution {
12 
13     public ListNode EntryNodeOfLoop(ListNode pHead)
14     {
15         ListNode fast = pHead;
16         ListNode slow = pHead;
17         
18         while(fast!=null && fast.next!=null)
19         {
20             fast = fast.next.next;
21             slow =slow.next;
22             
23             if(fast ==slow)
24                 break;
25         }
26         
27         if(fast==null || fast.next==null)
28             return null;
29         fast = pHead;
30         
31         while(fast!=slow)
32         {
33             fast =fast.next;
34             slow = slow.next;
35         }
36         return fast;
37         
38     }
39 }
原文地址:https://www.cnblogs.com/wangyufeiaichiyu/p/10896275.html