LeetCode 0141.リンク一覧サイクル簡単円形のリンクリスト[] [] [Pythonのダブルポインタ]
タイトル
それはそれでサイクルを持っている場合、リンクされたリストを考えると、決定します。
与えられたリンクされたリストにサイクルを表すために、我々は整数使用pos
尾に接続するリンクされたリスト内の位置(0インデックス)を表します。場合pos
で-1
は、リンクされたリストにはサイクルがありません。
例1:
Input: head = [3,2,0,-4], pos = 1
Output: true
Explanation: There is a cycle in the linked list, where tail connects to the second node.
例2:
Input: head = [1,2], pos = 0
Output: true
Explanation: There is a cycle in the linked list, where tail connects to the first node.
例3:
Input: head = [1], pos = -1
Output: false
Explanation: There is no cycle in the linked list.
ファローアップ:
あなたは使用してそれを解決することができますO(1) (すなわち一定の)メモリを?
翻訳
リストを指定すると、リストがリングかどうかが決定されます。
リングを与えられたリストを表示するために、我々は、整数を使用してpos
(インデックス0から始まる)リストのリストの最後に接続された位置を示します。場合pos
で-1
、このリストにはループがありません。
例1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
例2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
例3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
高度:
あなたは使用することができますO(1)この問題を解決するために(すなわち、一定の)メモリを?
思考
ダブルポインタ
ダブルポインタによる高速と低速では、ポインタの速度速い遅い速度はチェーンがリングを持っている場合は、ダブルポインタの速度が、満たされる、倍増され、ここでリンクを証明します。
宇宙複雑:O(1)
Pythonコード
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def hasCycle(self, head):
"""
:type head: ListNode
:rtype: bool
"""
if head == None:
return False
slow, fast = head, head # 快慢双指针
while fast.next != None and fast.next.next != None: # 一定是 fast.next 和 fast.next.next
slow = slow.next
fast = fast.next.next # fast快指针速度是slow慢指针的两倍
if slow == fast: # 如果链表有环, fast 和 slow 必会相遇
return True
return False