題目描述:判斷是否有環給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 null。
為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。注意,pos 僅僅是用於標識環的情況,並不會作為引數傳遞到函式中。
說明:不允許修改給定的鍊錶。
返回入環的結點
不要被題目中的pos迷惑,在解題時可以先不考慮這個條件
/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solution
return
nullptr;}
};
變數引入說明:slow: 慢指標,初始為頭節點,每次移動一位
fast: 快指標,初始為頭節點,每次移動兩位
con: 條件指標,初始化為頭節點。當slow==fast時(初始化的頭結點相等不算,此處指開始移動過後再次相遇的位置),開始移動,每次移動一位
解題思路分析:
如圖一所示,a表示單鏈表的長度,b+c表示雙鏈表的長度,紫色點為slow和fast的相遇點。存在如下等式關係:
slow *
2= fast;
slow = a + b;
fast = a + b +
n(c + b)
;(a + b)*2
= a + b +
n(c + b)
;a = c+
(n-1
)(b+c)
;等式1:快針走的是慢針的兩倍
等式2:第一次相遇時,slow的路程
等式3:第一次相遇時,fast的路程
等式4:二倍關係
等式5:從相遇點到入環點的距離加上 n-
1 圈的環長,恰好等於從鍊錶頭部到入環點的距離。此時,con開始移動,con和slow會在入環點相遇。
時間複雜度:o(n)
空間複雜度:o(1)
f1. 來自leetcode官網
參考**
/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solution
return ans;}}
return
nullptr;}
};
鍊錶 環形鍊錶
環形鍊錶也叫迴圈鍊錶 可以是雙鏈表 也可以是單鏈表 操作原理和單鏈表差不多,只是最後乙個節點不在指向空 null 而是頭 head 這裡以單鏈表舉例 description 環形鍊錶 author lzq date 2018 11 3 20 46 version 1.0 public class a...
環形鍊錶 鍊錶
題目 給定乙個鍊錶,判斷鍊錶中是否有環。為了表示給定鍊錶中的環,我們使用整數pos來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果pos是 1,則在該鍊錶中沒有環。示例 1 輸入 head 3,2,0,4 pos 1 輸出 true 解釋 鍊錶中有乙個環,其尾部連線到第二個節點。示例 2 輸入...
鍊錶 環形鍊錶 II
給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回null。說明 不允許修改給定的鍊錶。高階 你是否可以不用額外空間解決此題?definition for singly linked list.class listnode public class solution start p1 ...