Python實現"迴文連結串列"的兩種方法
阿新 • • 發佈:2018-12-12
判斷給定的連結串列是否是迴文連結串列
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