請判斷乙個鍊錶是否為回文鍊錶。
示例 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 輸...