Pythonのアルゴリズム日記(リストシリーズ)_leetcode 142円リンクリストII

リストを考えると、チェーンリングの初めに最初のノードを返します。鎖非環式ならば、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速ポインタ満たす入口ノードを取ります。(ハードは、以下のことを証明するために行う、この法則を考えて)

image.png

公式の回答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

 

公開された44元の記事 ウォンの賞賛0 ビュー1904

おすすめ

転載: blog.csdn.net/weixin_39331401/article/details/104607755