LeetCode初級演算法之鍊錶 回文鍊錶

2021-10-01 04:28:51 字數 1858 閱讀 5685

請判斷乙個鍊錶是否為回文鍊錶。

示例 1:

輸入: 1->2

輸出: false

示例 2:

輸入: 1->2->2->1

輸出: true

高階:你能否用 o(n) 時間複雜度和 o(1) 空間複雜度解決此題?

思路一: 借助外來的空間

這個題我的初步思路是借助外來的空間,也就不是o(1)的空間複雜度,那麼這個就比較簡單了,只需要遍歷一遍鍊錶,把每個元素存入到陣列中,然後看看是不是回文陣列就可以了,陣列的優勢就是記憶體連續,查詢方便,這個就不多解釋了,直接上**

class

solution

for(

int i=

0,j=v.

size()

-1; i<=j;i++

,j--

)return

true;}

};

這個速度還是比較快的。但是空間複雜度o(n),畢竟弄了乙個陣列。

思路二: 快慢指標找中點

這個思路是借鑑人家的乙個思路,使用快慢指標,竟然可以找到鍊錶的中點,這個之前是不知道的,這次學到了,就是兩個指標開始的時候,都指向第乙個元素,之後,往前走,快的指標一次走兩步,慢的指標一次走一步,這樣的話當快的走到頭的時候,慢的正好走到中點位置。 這個想法簡直是太好了。 這個題就可以使用這個思想。

就是先找到中點,然後前面的部分逆置,然後前面的一半和後面的一半再比較。這樣的話,空間複雜度就是o(1)了。

class

solution

// 如果是奇數個節點,這時候fast正好是不為空,此時,slow正好是中間位置,需要往後移動一下

if(fast)

slow = slow-

>next;

// 下面就可以開始比較了,前半部分是pre指向,後半部分是slow指向,如果不一樣的話,就不是回文串

while

(pre && slow)

return

true;}

};

python**:

class

solution

:def

ispalindrome

(self, head: listnode)

->

bool

:

dummy = listnode(-1

) dummy.

next

=none

fast = slow = head

while fast and fast.

next

: temp = slow

slow = slow.

next

fast = fast.

next

.next

temp.

next

= dummy.

next

dummy.

next

= temp

if fast:

slow = slow.

next

p = dummy.

next

while p and slow:

if p.val != slow.val:

return

false

p = p.

next

slow = slow.

next

return

true

這個快慢指標的思想值得借鑑,見後面的總結。

最後稍微總結一下:快慢指標

leetcode初級演算法 鍊錶

題目源自leetcode,方法都是自 cai 己 ji 寫的,可能比較符合菜雞們的思路 鍊錶是做到現在,感覺自己最拉垮的一節,資料結構真的都還給老師了 請編寫乙個函式,使其可以刪除某個鍊錶中給定的 非末尾 節點。傳入函式的唯一引數為 要被刪除的節點 示例 1 輸入 head 4,5,1,9 node...

LeetCode初級演算法之鍊錶 206 反轉鍊錶

題目資訊 反轉乙個單鏈表。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null 高階 你可以迭代或遞迴地反轉鍊錶。你能否用兩種方法解決這道題?解法一 迭代 反轉乙個鍊錶和陣列是不一樣的,因為不能任意取值,只能說按照next的順序依次往後放。那麼把乙個節點往後放的過程就是一次迭...

LeetCode 初級演算法 環形鍊錶

給定乙個鍊錶,判斷鍊錶中是否有環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。示例 1 輸入 head 3,2,0,4 pos 1 輸出 true 解釋 鍊錶中有乙個環,其尾部連線到第二個節點。示例 2 輸...