請判斷乙個鍊錶是否為回文鍊錶。
示例 1:
輸入: 1->2
輸出: false
示例 2:
輸入: 1->2->2->1
輸出: true
高階:
你能否用 o(n) 時間複雜度和 o(1) 空間複雜度解決此題?
這個題稍微有些複雜,首先一定得找到中點,所以還是使用快慢指標,當快指標到達終點時,慢指標就到中點了,然後需要用棧來儲存慢指標遍歷的元素,因為要與後面一半的鍊錶值對比需要將前面一半反向。
c++源**:
/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solutionif(
!fast-
>next) s.
pop();
while
(slow-
>next)
return
true;}
};
在高階中提出了要求需要使用o(1)空間,所以不可以使用棧了,這樣就只能把前面或者後面的鍊錶反轉然後進行對比即可,這裡將後面的鍊錶進行反轉,反轉的思路迴圈將後乙個指標指向前面乙個指標,而最前面的指標將指向最後(在中間過程中是讓它不停指向之後指標的下乙個)。所以需要乙個last來儲存最開始的位置,當這個位置指向了空,說明後面的鍊錶已經反轉完畢。
python3源**:
# definition for singly-linked list.
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class
solution
:def
ispalindrome
(self, head)
:"""
:type head: listnode
:rtype: bool
"""if head==
none
or head.
next
==none
:return
true
slow = head
fast = head
while fast.
next
!=none
and fast.
next
.next
!=none
: slow = slow.
next
fast = fast.
next
.next
last = slow.
next
pre = head
while last.
next
!=none
: tmp = last.
next
last.
next
= tmp.
next
tmp.
next
= slow.
next
slow.
next
= tmp
while slow.
next
!=none
: slow = slow.
next
if pre.val != slow.val:
return
false
pre = pre.
next
return
true
leetcode刷題234 回文鍊錶
題目描述 請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false示例 2 輸入 1 2 2 1 輸出 true高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?思路 將鍊錶中的資料轉存到陣列中,在陣列中用雙指標比較 definition for singly link...
演算法 LeetCode 234 回文鍊錶
原題鏈結 請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?related topics 鍊錶 雙指標 802 0 題解1 解法 1 遍歷一遍鍊錶並儲存到陣列中,然...
LeetCode刷題日記 234 回文鍊錶
判斷乙個給定的鍊錶是否為回文鍊錶。我首先想到的第乙個方案是用反轉鍊錶中的步驟將整個鍊錶反轉,然後比較反轉後的鍊錶與反轉前鍊錶是否相同,如下 definition for singly linked list.struct listnode class solution if curr head el...