برنامه نویسی

وبلاگ الگوریتم های من「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)

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا