题目链接

题目大意:141题目的扩展,给出单链表,判断是否有环,如果有环,找出环的开始的结点,如果没有环,返回null。

法一(借鉴):在已经找出单链表环的基础上再找开始结点,要时刻记住这个环不一定是从尾结点到头结点,有可能是中间的某一段。所以对于这里具体路径的分析,有两个博客可看http://blog.csdn.net/xy010902100449/article/details/48995255http://blog.csdn.net/willduan1/article/details/50938210,都是从数学层面去证明方法的可行性,也就是为什么可以在找到相遇点后,再从头开始遍历,第二次相遇点就是开始结点的问题。代码如下(耗时1ms):

 1     public ListNode detectCycle(ListNode head) {
 2         ListNode fast = head;
 3         ListNode slow = head;
 4         while(fast != null && fast.next != null) {
 5             fast = fast.next.next;
 6             slow = slow.next;
 7             if(fast == slow) {
 8                 fast = head;
 9                 while(fast != slow) {
10                     fast = fast.next;
11                     slow = slow.next;
12                 }
13                 return fast;
14             }
15         }
16         return null;
17     }
View Code

相关文章: