142.Linked List Cycle II---雙指針

題目連接ide

題目大意:141題目的擴展,給出單鏈表,判斷是否有環,若是有環,找出環的開始的結點,若是沒有環,返回null。spa

法一(借鑑):在已經找出單鏈表環的基礎上再找開始結點,要時刻記住這個環不必定是從尾結點到頭結點,有多是中間的某一段。因此對於這裏具體路徑的分析,有兩個博客可看http://blog.csdn.net/xy010902100449/article/details/48995255http://blog.csdn.net/willduan1/article/details/50938210,都是從數學層面去證實方法的可行性,也就是爲何能夠在找到相遇點後,再從頭開始遍歷,第二次相遇點就是開始結點的問題。代碼以下(耗時1ms):.net

 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

法二:利用了141的法二,直接用set存入,若是有相同的則說明確定是環的開始結點,直接返回便可。此方法的時間複雜度和空間複雜度都挺大的。代碼以下(耗時16ms):code

 1         Set<ListNode> list = new HashSet<>();
 2         while(head != null) {
 3             if(list.contains(head)) {
 4                 return head;
 5             }
 6             else {
 7                 list.add(head);
 8                 head = head.next;
 9             }
10         }
11         return null;
View Code
相關文章
相關標籤/搜索