這道題的限制是時間複雜度是o(n)
,空間複雜度是o(1)
,所以我們不能使用常規的方法,常規的方法就是將鍊錶中的資料儲存在陣列中,然後通過陣列判斷是否是回文陣列,這自然很簡單
所以在本題,我們採用的思路就是將鍊錶的後面半部分反轉,然後再比較前面半部分和後面半部分是否相同
首先我們需要找到後面半部分,採用的方法是雙指標的思路,快指標每次向後面走兩步,慢指標每次向後面走一步,當快指標走到鍊錶最後的時候,慢指標剛好走了一半,具體如下:
然後從慢指標的下乙個結點開始反轉鍊錶
此時就可以從原本的鍊錶末尾向前遍歷半個鍊錶了,然後將第乙個元素與最後乙個元素比較,第二個元素與倒數第二個元素比較。。。
如果中間出現了不相等的元素,那麼就直接返回false
,如果整個鍊錶的元素都比較完了,那麼就返回true
**如下
func ispalindrome(head *listnode) boolfast, slow := head.next, head
for fast != nil
fast = fast.next
if fast.next == nil
fast = fast.next
slow = slow.next
}// 反轉後面半部分的鍊錶
pre := slow.next
cur := pre.next
for cur != nil
reverse := pre
for head != slow.next else
}return true
}
leetcode之234回文鍊錶
請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?此題分三步進行 第一步先找出中間節點,第二步從中間節點開始反轉,第三步比較後面部分反轉後與前面部分是否相等,如下 ...
LeetCode 234 回文鍊錶
請判斷乙個鍊錶是否為回文鍊錶。definition for singly linked list.struct listnode bool ispalindrome struct listnode head 示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 要...
leetcode 234 回文鍊錶
請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2輸出 false 示例 2 輸入 1 2 2 1輸出 true 解法1 使用棧 使用快慢指標找中點,原理是每次快指標走兩步,慢指標走一步,等快指標走完時,慢指標的位置就是中點。我們還需要用棧,每次慢指標走一步,都把值存入棧中,等到達中點時,鍊錶的前...