請判斷乙個鍊錶是否為回文鍊錶。
示例 1:
輸入: 1->2
輸出: false
示例 2:
輸入: 1->2->2->1
輸出: true
對於這個題目,要求時間複雜度子啊o(n),空間複雜度為o(1)
對於回文 我們好的辦法就是找出中間的節點,然後從中間開始,乙個個比較,看是否是回文的
找到中間節點很簡單,只要設定兩個指標,快慢指標,快指標的速度是慢指標的兩倍,這樣當快指標到達最後的時候,慢指標這時候指的位置就是中間的位置。如果我們需要比較,還需要將後半段的鍊錶進行反轉,這樣就可以實現比較了,比較反轉後的與前面的是否一樣,如果一樣就可以返回true,如果不一樣就可以立即返回false
對於鍊錶的反轉是解決本題的重點
# 快慢指標分割鍊錶
slow, fast = head, head
while fast.next and fast.next.next:
fast = fast.next.next
slow = slow.next
first = head
last = slow.next
slow.next = none
# 反轉後半段鍊錶
pre, cur = none, last
while cur:
tmp = cur.next
cur.next = pre
pre = cur
cur = tmp
last = pre
# 逐項對比
cur_f, cur_l = first, last
while cur_l:
if cur_f.val != cur_l.val:
return false
cur_f, cur_l = cur_f.next, cur_l.next
return true
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
LeetCode每日一題(題1028)
最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...
LeetCode每日一題(題139)
題目 題目大意 給出乙個字串s和乙個字串陣列words,判斷s是否能夠拆分成多個words中的字串。分析 這道題比較簡單的方式應該是採用動態規劃來做。對於任意乙個字串中的區間,可以判斷該區間組成的字串是否在字典中,如果是,則這個區間的真假取決於前面那個區間的真假。給出狀態轉移方程dp i dp j ...