package
0.0.0-20241220224003-b7cf03a90b2b
Repository: https://github.com/szhou12/leetcode-go.git
Documentation: pkg.go.dev
# README
142. Linked List Cycle II
Solution idea
-
Step 1: 同
LC-141
. 双指针同向而行, fast指针走两步,slow指针走一步. 判断:1. 是否有环. 2. 若有环,fast和slow的相遇节点 -
Step 2: fast指针从头节点开始,slow指针从 Step 1的相遇节点开始。双指针同向而行, fast指针走一步,slow指针走一步. fast和slow的相遇节点即为环的起始节点。
- Why?
- 设:头节点到环的起始节点的节点数(路程)为
x
, 环的起始节点到Step 1相遇节点的节点数(路程)为y
, Step 1相遇节点到环的起始节点的节点数(路程)为z
- 在Step 1中:
- Key 1: fast 走到相遇节点花的路程数为:
x+y+n(y+z)
, $n \geq 1$. - Key 2: slow 走到相遇节点花的路程数为:
x+y
. - Key 3: fast 的速度为 2, slow 的速度为 1.
- Key 4: fast 和 slow 会相遇,说明他们走的时间 t 是相同的
- 由以上 4 点,我们可以推导出 fast 和 slow 的关系:
fast: t = (x+y+n(y+z)) / 2 slow: t = (x+y) / 1 => (x+y+n(y+z)) / 2 = (x+y) / 1 => x+y+n(y+z) = 2(x+y) => n(y+z) = x+y => (n-1)(y+z) + z = x => z = x for n == 1; z = x for n > 1 as well bc (y+z) is whole cycle
- Key 1: fast 走到相遇节点花的路程数为:
- 所以,在Step 2中,只需要一个指针从头节点走,另一个指针从Step 1相遇节点走,两人同时以相同的速度走,相遇的地方就是环的起始节点
- 设:头节点到环的起始节点的节点数(路程)为
Time comlexity = $O(n)$