وبلاگ الگوریتم های من「141. چرخه لیست پیوندی」

مسئله
وظیفه تعیین این است که آیا یک لیست پیوند داده شده حاوی یک چرخه است یا خیر. ورودی در قالب زیر ارائه می شود، جایی که هر عنصر نشان دهنده مقدار یک گره در لیست پیوند شده است:
Input: head = [3,2,0,-4], pos = 1
Input: head = [1,2], pos = 0
اگر لیست پیوندی حاوی یک چرخه باشد، تابع باید True را برگرداند.
در غیر این صورت، باید False را برگرداند. توجه داشته باشید که موقعیت pos
جایی که چرخه به لیست پیوندی متصل می شود به عنوان پارامتر ارسال نمی شود.
رویکرد اول
رویکرد اولیه من از یک اشاره گر سریع و یک اشاره گر آهسته استفاده می کند. اشاره گر سریع دو مرحله در یک زمان حرکت می کند، در حالی که نشانگر آهسته یک قدم در یک زمان حرکت می کند. اگر نشانگر سریع با اشاره گر آهسته ملاقات کند، نشان دهنده وجود یک چرخه در لیست پیوند شده است. با این حال، پس از بررسی کد من، معتقدم که ممکن است ناکارآمد باشد و بتوان آن را بهینه کرد.
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def hasCycle(self, head: Optional[ListNode]) -> bool:
if not head:
return False
fast = slow = head
while fast.next != None:
if fast.next.next == None:
return False
else:
fast = fast.next.next
slow = slow.next
if fast == slow:
return True
return False
-
پیچیدگی زمانی:
O(n)
-
پیچیدگی فضا:
O(1)
بر اساس بررسی LeetCode، که از الگوریتم چرخه یافتن فلوید استفاده می کند، کد من در زیر در مقایسه با کد پاسخ ارائه شده نشان داده شده است.
class Solution:
def hasCycle(self, head: Optional[ListNode]) -> bool:
if not head:
return False
slow = head
fast = head.next
while slow != fast:
if fast is None or fast.next is None:
return False
slow = slow.next
fast = fast.next.next
return True
-
پیچیدگی زمانی:
O(n)
-
پیچیدگی فضا:
O(1)