↓快轉到主要內容
  1. LeetCode/

LeetCode 234: Palindrome Linked List

·1 分鐘· ·
LeetCode Easy Linked-List Two-Pointers Stack Recursion
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2022-08-22

  • 提交紀錄:Runtime Error → Time Limit Exceeded → Accepted ×2

解題思路
#

串列不能從後面往前走,所以把後半段反轉(Linked List 模板二、三):

  1. 快慢指針找中點。
  2. 從中點開始反轉後半段。
  3. 一個從頭、一個從反轉後的頭,一起往後比;後半段走完就結束(奇數長度時中間那個不用比)。

我的嘗試
#

第一版語法錯誤;第二版的迴圈指標沒有前進,[1] 就無限迴圈 TLE。我當時 AC 的版本是先把值存進 list 再比,這裡改成 O(1) 空間的做法。

正確解法
#

class Solution:
    def isPalindrome(self, head: Optional[ListNode]) -> bool:
        slow = fast = head
        while fast and fast.next:
            slow, fast = slow.next, fast.next.next
        prev = None
        while slow:                                  # 反轉後半段
            slow.next, prev, slow = prev, slow, slow.next
        while prev:
            if prev.val != head.val:
                return False
            prev, head = prev.next, head.next
        return True

複雜度
#

時間 O(n),空間 O(1)。

要特別避免的錯誤
#

  • 只比到後半段結束,前半段的尾巴還連著中間那個節點。
  • 這個做法會改到原串列;如果不能改,就要先複製值到陣列(O(n) 空間)。

面試口說整理
#

我用快慢指針找到中點,把後半段反轉,然後從頭和反轉後的頭一起往後比。全部相同就是回文。時間 O(n)、額外空間 O(1)。

相關文章

LeetCode 203: Remove Linked List Elements
·1 分鐘
LeetCode Easy Linked-List Recursion
LeetCode 203 解題筆記:頭節點也可能要刪,用 dummy head 讓每次刪除都變成刪 cur.next;刪完不要前進
LeetCode 206: Reverse Linked List
·1 分鐘
LeetCode Easy Linked-List Recursion
LeetCode 206 解題筆記:prev / cur / nxt 三個指標,先記住下一個,再把 cur.next 指回 prev
LeetCode 141: Linked List Cycle
·1 分鐘
LeetCode Easy Hash-Table Linked-List Two-Pointers Floyds-Cycle-Finding-Algorithm
LeetCode 141 解題筆記:Floyd 判圈,快指針一次兩步、慢指針一次一步,有環就一定會相遇;兩個都要從自己的位置往前走
LeetCode 160: Intersection of Two Linked Lists
·1 分鐘
LeetCode Easy Hash-Table Linked-List Two-Pointers
LeetCode 160 解題筆記:兩個指標走完自己的串列就換走對方的,都走 lenA + lenB 步,會同時到達交點或同時到 None
LeetCode 231: Power of Two
·1 分鐘
LeetCode Easy Math Bit-Manipulation Recursion
LeetCode 231 解題筆記:2 的次方只有一個位元是 1,n & (n - 1) 會把最低的 1 消掉,結果是 0 就是;n 要是正數
LeetCode 232: Implement Queue using Stacks
·1 分鐘
LeetCode Easy Stack Design Queue
LeetCode 232 解題筆記:兩個 stack:in 負責 push,out 空的時候才把 in 全部倒過去,均攤 O(1)