リストを考えると、チェーンリングの初めに最初のノードを返します。鎖非環式ならば、nullが返されます。
リングを与えられたリストを表示するために、我々は、POS整数(インデックスは0から始まる)リストの位置を表すために、リストの最後に接続されています。posが-1の場合、リングがこのリストに含まれていません。
説明:指定されたリストを変更しないようにしてください。
例1:
入力:ヘッド= [3,2,0、-4] 、POS = 1
出力:ノードインデックス1にテールコネクトは
説明:リストは、第2のノードに接続されたリングテール部分を有しています。
例2:
入力:ヘッド= [1,2]、POS = 0
出力:ノードインデックス0に尾コネクト
説明:リストは、最初のノードの尾部に接続されたリングを有しています。
例3:
输入:head = [1], pos = -1
输出:no cycle
解释:链表中没有环。
出典:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/linked-list-cycle-ii
方法:要素の順序付けられていない配列のプロパティのセット(組)を使用しては繰返しません。訪問したノードセットの存在、循環リンクリストの拡張、I練習
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def detectCycle(self, head: ListNode) -> ListNode:
if not head or not head.next:
return None
visited = set()
while(head):
if head in visited:
return head
else:
visited.add(head)
head = head.next
return None
方法2:ポインタの速度。参考LeetCode公式回答
リンクします。https://leetcode-cn.com/problems/linked-list-cycle-ii/solution/huan-xing-lian-biao-ii-by-leetcode/
フェーズワン:リストが円形である場合には、ポインタ遅いステップは、2倍の速ポインタを移動し、ポインタが常にリング内のノードの速度を満たしています。想像して、実行中のリングで、いつもより遅くランナーに追いつくために速く走ります。したがって、リングポインタリストの速度を満たすことが証明しました。
フェーズII:最初の出会いの後、ロケーション、開始位置への高速ポインタに遅いポインタ静止点が発生します。高速ポインタの変更は、一の工程のみ、常に2速ポインタ満たす入口ノードを取ります。(ハードは、以下のことを証明するために行う、この法則を考えて)
公式の回答LeetCodeから写真
Fは、リングへの入口から出発して、H、速度満たしポインタの位置です。Hは、二つの部分とB環に環入口。
場合大環、+ B> Fの場合:
Hスピードポインタポイントは、ポインタF +スローダウン、会う、それは、より高速なポインタのリングよりも歩くF + A + B +に行くことです。ポインタので遅い歩行距離は、高速ハーフ2(F +)ポインタである= F + 2A + B、F = Bそう。+ B = F +、B = F.を歩いて、すなわちリング すなわち、高速ステップ1 Bに行き、ステップ1 F.、スローポインタ位置hに位置ポインタ行くを開始し、彼らは入り口の位置で会う予定です。
ときリングは、Fの場合、長い距離が非常に小さいです。
小さなリング、それはすぐにポインタnリングを行くことがあります。2(F +)= F + A + N(+ b)は、F =(N-1)(+ b)は+ B。
Fの歩行距離は、+ Bの周りにラップの多くは、まだ入り口と別の出会いに来るので。
コメントの証明:
以下からの振動@ https://leetcode-cn.com/u/zhen-zhi/、リングは、+ B> Fケース大であることを彼の分析。
図1:スローダウンポインタ遅いnは入口リングを行くと、速い速い現在のポインタの位置を降りてくる2N。
図2:N + Bポインタを減速は、現在位置、現在の位置Nインレットリングから来ます。このとき、ポインタが速い遅いポインタで満たすために、2(N + B)を歩きます。すぐに戻っ開始ノードへのポインタをしてみましょう、同じ手順はで会ったn個インレットリングを行くことができます。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def detectCycle(self, head: ListNode) -> ListNode:
if not head or not head.next:
return None
slow = fast = head
while(fast.next.next and slow.next):
fast = fast.next.next
slow = slow.next
if not fast.next or not slow.next:
return None
if fast == slow:
cur = slow
pre = head
while(cur!=pre):
cur = cur.next
pre = pre.next
return cur
return None