Leetcode 234. 迴文連結串列 快慢指標+連結串列逆序實現O(n)時間複雜度且O(1)空間複雜度
題目要求
判斷一個連結串列是否為迴文連結串列。
解題思路
不限制時間複雜度的情況下是非常簡單的題目,可以有多種方法完成本題。
如果限制了 O ( n ) O(n) O(n) 時間複雜度且 O ( 1 ) O(1) O(1) 空間複雜度那麼可以按照以下思路。
連結串列題中看到 O ( n ) O(n) O(n) 時間複雜度且 O ( 1 ) O(1) O(1) 空間複雜度可以考慮快慢指標就相當於陣列題看到 O ( n ) O(n) O(n) 時間複雜度且 O ( 1 ) O(1) O(1) 空間複雜度可以考慮雙指標一樣。
那麼從快慢指標開始思考。我們知道,快慢指標可以找連結串列的中點。迴文連結串列只需要對連結串列中點兩邊進行比較就可以知道結果,因此先用快慢指標找到連結串列的中點。
找到中點以後需要令前半部分末尾等於 N o n e None None,因此為了方便起見,前半部分找到中點左邊的一個點,就停止。假設中間節點是 m e d i a n median median,我們希望 s l o w slow slow 停留在 m e d i a n median median 的左邊第一個節點,這樣我們只要令 s l o w . n e x t = N o n e slow.next = None slow.next=None 就可以得到左半部分連結串列。
此時右半部分連結串列只需要令 c u r = s l o w . n e x t cur = slow.next cur=slow.next,這樣 c u r cur cur 就是右半連結串列。
利用雙指標反轉連結串列的方式,反轉連結串列之後進行比較節點的值就可以得到結果。在比較的時候,我們之前這樣處理以後,右半部分一定不大於左半部分的長度,因此遍歷右半部分,這樣如果連結串列長度是奇數的時候,不需要考慮中間節點。
以下用多張圖具體說明這個過程:
- 連結串列長度是奇數
2.3.4.5.6.7.8.9.10.11.12.13.
- 連結串列長度是偶數時,可以嘗試用同樣的方式處理
程式碼
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def isPalindrome(self, head: ListNode) -> bool:
if not head:
return True
fast = slow = head
while fast.next and fast.next.next:
fast = fast.next.next
slow = slow.next
pre = None
cur = slow.next
slow.next = None
while cur:
tmp = cur.next
cur.next = pre
pre = cur
cur = tmp
while pre:
if head.val != pre.val:
return False
head = head.next
pre = pre.next
return True
複雜度分析
時間複雜度
O
(
n
)
O(n)
O(n) 其中
n
n
n 是連結串列的長度
空間複雜度
O
(
1
)
O(1)
O(1) 沒有使用額外空間
工作之餘刷刷題寫寫題解,我的Leetcode主頁
相關文章
- 判斷連結串列是否為迴文結構,空間負責度為O(1),時間複雜度為O(n)時間複雜度
- 時間複雜度O(n)和空間複雜度時間複雜度
- 時間複雜度O(1)、O(n)、O(n²)、O(nlogn)的含義時間複雜度
- O1空間複雜度實現陣列迴圈右移_LeetCode189複雜度陣列LeetCode
- 時間複雜度與空間複雜度時間複雜度
- 時間複雜度和空間複雜度時間複雜度
- 時間複雜度跟空間複雜度時間複雜度
- LeetCode 234. 迴文連結串列LeetCode
- Java實現:排序演算法--時間複雜度為O(n² )Java排序演算法時間複雜度
- leetcode 234.迴文連結串列 JavaLeetCodeJava
- 複雜連結串列的複製
- leetcode 876. 連結串列的中間結點(快慢指標法)LeetCode指標
- 時間複雜度為 O(n^2) 的排序演算法時間複雜度排序演算法
- 時間複雜度為 O (n^2) 的排序演算法時間複雜度排序演算法
- 234. 迴文連結串列
- 演算法與資料結構--空間複雜度O(1)遍歷樹演算法資料結構複雜度
- 複雜連結串列的復刻
- 劍指 Offer 35. 複雜連結串列的複製
- [Golang]力扣LeetBook—初級演算法—連結串列—迴文連結串列(快慢指標)Golang力扣演算法指標
- 時間與空間複雜度分析複雜度
- 13. O(1)時間刪除連結串列節點
- 資料結構:時間複雜度資料結構時間複雜度
- JZ-025-複雜連結串列的複製
- 122 演算法的時間複雜度和空間複雜度詳解演算法時間複雜度
- 時間複雜度為 O(nlogn) 的排序演算法時間複雜度排序演算法
- 快速排序平均時間複雜度O(nlogn)的推導排序時間複雜度
- 時間複雜度為O(nlogn)的排序演算法時間複雜度排序演算法
- 資料結構-邏輯關係&物理關係、時間複雜度、空間複雜度、順序表資料結構時間複雜度
- 自學 資料結構四月二十一日_時間複雜度&空間複雜度資料結構時間複雜度
- 那些年忽略的知識:時間複雜度和空間複雜度詳解時間複雜度
- PHP 演算法基礎----時間複雜度和空間複雜度(轉載)PHP演算法時間複雜度
- 二叉樹的 Morris 中序遍歷——O(1)空間複雜度二叉樹複雜度
- LeetCode 複製帶隨機指標的連結串列LeetCode隨機指標
- 時間複雜度怎麼算?如何計算時間複雜度?時間複雜度
- 面試題35:複雜連結串列的複製面試題
- [連結串列]leetcode138-複製帶隨即指標的連結串列LeetCode指標
- 一文講透演算法中的時間複雜度和空間複雜度計算方式演算法時間複雜度
- 易被忽略的知識點之 ---- 各種時間複雜度和空間複雜度時間複雜度