題目連接ide
題目大意:141題目的擴展,給出單鏈表,判斷是否有環,若是有環,找出環的開始的結點,若是沒有環,返回null。spa
法一(借鑑):在已經找出單鏈表環的基礎上再找開始結點,要時刻記住這個環不必定是從尾結點到頭結點,有多是中間的某一段。因此對於這裏具體路徑的分析,有兩個博客可看http://blog.csdn.net/xy010902100449/article/details/48995255,http://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 }
法二:利用了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;