1. 程式人生 > >Python實現"迴文連結串列"的兩種方法

Python實現"迴文連結串列"的兩種方法

判斷給定的連結串列是否是迴文連結串列

Example 1:

Input: 1->2
Output: false

Example 2:

Input: 1->2->2->1
Output: true

進階:

用時間複雜度為O(n),空間複雜度為O(1)完成

1:將連結串列中節點的值存入列表中,然後判斷列表是否滿足迴文條件。時間複雜度O(n),空間複雜度O(n)

def isPalindrome(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        nodeList = []
        while head:
            nodeList.append(head.val)
            head = head.next
        for i in range(len(nodeList)//2):
            if nodeList[i] != nodeList[len(nodeList)-i-1]:
                return False
        return True

2:翻轉前半部分連結串列,然後和後半部分連結串列進行對比,時間複雜度O(n),空間複雜度O(1)(參考他人)

def isPalindrome(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        prev = None
        fast = slow = head
        while fast and fast.next:        #翻轉連結串列的前n/2個結點,prev為翻轉後的頭結點
            fast = fast.next.next
            prev, prev.next, slow = slow, prev, slow.next
        if fast:       #結點個數為奇數時,跳過最中間的結點
            slow = slow.next
        while slow and slow.val == prev.val:        #前n/2個結點翻轉後,與剩下的結點進行對比
            prev, slow = prev.next, slow.next
        return not prev