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)的含義時間複雜度
- 【資料結構】-時間複雜度和空間複雜度資料結構時間複雜度
- 正規表示式時間複雜度O(n)時間複雜度
- 時間複雜度跟空間複雜度時間複雜度
- 時間複雜度和空間複雜度時間複雜度
- 時間複雜度與空間複雜度時間複雜度
- Java實現:排序演算法--時間複雜度為O(n² )Java排序演算法時間複雜度
- 時間複雜度和空間複雜度 順序時間複雜度
- O1空間複雜度實現陣列迴圈右移_LeetCode189複雜度陣列LeetCode
- 時間複雜度為 O (n^2) 的排序演算法時間複雜度排序演算法
- 時間複雜度為 O(n^2) 的排序演算法時間複雜度排序演算法
- 關於計算時間複雜度和空間複雜度時間複雜度
- 一道看上去很嚇人的演算法面試題:如何對n個數進行排序,要求時間複雜度O(n),空間複雜度O(1)演算法面試題排序時間複雜度
- LeetCode 234. 迴文連結串列LeetCode
- 演算法與資料結構--空間複雜度O(1)遍歷樹演算法資料結構複雜度
- 【演算法資料結構Java實現】時間複雜度為O(n)的最大和序列演算法資料結構Java時間複雜度
- 複雜連結串列的賦值賦值
- [Golang]力扣LeetBook—初級演算法—連結串列—迴文連結串列(快慢指標)Golang力扣演算法指標
- 時間與空間複雜度分析複雜度
- leetcode 876. 連結串列的中間結點(快慢指標法)LeetCode指標
- leetcode 234.迴文連結串列 JavaLeetCodeJava
- 資料結構~時間複雜度資料結構時間複雜度
- 資料結構:時間複雜度資料結構時間複雜度
- 自學 資料結構四月二十一日_時間複雜度&空間複雜度資料結構時間複雜度
- 利用快慢指標快速得到連結串列中間節點指標
- 面試題35:複雜連結串列的複製面試題
- 冰與火之歌:「時間」與「空間」複雜度複雜度
- 資料結構-邏輯關係&物理關係、時間複雜度、空間複雜度、順序表資料結構時間複雜度
- 時間複雜度怎麼算?如何計算時間複雜度?時間複雜度
- PHP 演算法基礎----時間複雜度和空間複雜度(轉載)PHP演算法時間複雜度
- 那些年忽略的知識:時間複雜度和空間複雜度詳解時間複雜度
- 二叉樹的 Morris 中序遍歷——O(1)空間複雜度二叉樹複雜度
- 時間複雜度為O(nlogn)的排序演算法時間複雜度排序演算法
- 快速排序平均時間複雜度O(nlogn)的推導排序時間複雜度
- 時間複雜度為 O(nlogn) 的排序演算法時間複雜度排序演算法
- 122 演算法的時間複雜度和空間複雜度詳解演算法時間複雜度