請判斷乙個鍊錶是否為回文鍊錶。
示例 1:
輸入: 1->2
輸出: false
示例 2:
輸入: 1->2->2->1
輸出: true
方法1:利用列表。
將鍊錶中的每個值都新增進列表中,然後倒序讀取得到乙個新的列表,判斷兩個列表是否相等。剛開始出錯的地方:注意利用列表的reverse()方法反轉列表的時候會對原列表直接更改,而且沒有返回值,這個時候就沒辦法用原列表與反轉之後的列表進行對比。所以可以利用切片的方法倒序讀取列表[::-1],這樣可以得到list_reverse,判斷list_reverse == list。
# definition for singly-linked list.
# class listnode(object):
# def __init__(self, x):
# self.val = x
# self.next = none
class solution(object):
def ispalindrome(self, head):
""":type head: listnode
:rtype: bool
"""cur = head
list_node =
while cur:
cur = cur.next
list_node_re = list_node[::-1]
return list_node == list_node_re
成功
顯示詳情
執行用時 : 100 ms, 在palindrome linked list的python提交中擊敗了87.37% 的使用者
記憶體消耗 : 31 mb, 在palindrome linked list的python提交中擊敗了16.99% 的使用者
方法2:快慢指標
(我剛開始想用快慢指標的時候想錯了,其實快指標是慢指標速度的2倍就可以了,這樣可以將鍊錶在中間部位分開,思路跟尋找鍊錶中間節點那道題類似,但是我當時想的是慢指標應該在head處開始游動,而快指標應該在對稱部分開始游動,然而我們不能確定對稱部分所以當時就拋棄了這個想法)
利用快慢指標,快指標的速度是慢指標的2倍,如果鍊錶中節點個數為奇數,那麼當快指標到鍊錶最後乙個節點的時候,慢指標正好到中間節點,這個時候要額外將slow更新為slow.next,然後將它的值與列表中pop處的值比較;如果鍊錶中節點的個數為偶數,那麼當快指標指到最後none的時候,慢指標指到鍊錶對稱軸的右邊乙個元素,此時不用更新slow,直接比較slow的值與列表中pop出的值。所以在快慢指標的while loop中,迴圈條件為fast和fast.next都不為none,然後迴圈結束之後判斷fast是否為none,若為就不用更新slow,否則更新slow
# definition for singly-linked list.
# class listnode(object):
# def __init__(self, x):
# self.val = x
# self.next = none
class solution(object):
def ispalindrome(self, head):
""":type head: listnode
:rtype: bool
"""slow,fast = head,head
#利用棧的特性,**棧的後出棧,將前半部分列表的value放進棧,與後半部分的對比
stack =
while fast and fast.next:
slow = slow.next
fast = fast.next.next
# 當stack為空時,說明原煉表為空或者只有乙個節點,此時一定為回文鍊錶,直接返回true
if not stack:
return true
# 退出迴圈後,如果fast存在,說明該鍊錶中節點數為奇數,slow指標指在對稱部分的左邊需要往右游動一次然後開始比較。
# 如果fast不存在,說明該鍊錶中節點數為偶數,slow指標指在對稱部分的右邊,此時不需要移動。
if fast:
slow = slow.next
while slow:
# 如果相等的話就繼續往後游動,一旦出現不相等的就返回false
if stack.pop() == slow.val:
slow = slow.next
else:
return false
# 一直到slow=none時退出迴圈,說明鍊錶左右兩部分是完全對稱的,直接返回false
return true
顯示詳情
執行用時 : 96 ms, 在palindrome linked list的python提交中擊敗了98.60% 的使用者
記憶體消耗 : 30.7 mb, 在palindrome linked list的python提交中擊敗了38.76% 的使用者
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 使用棧 使用快慢指標找中點,原理是每次快指標走兩步,慢指標走一步,等快指標走完時,慢指標的位置就是中點。我們還需要用棧,每次慢指標走一步,都把值存入棧中,等到達中點時,鍊錶的前...
LeetCode 234 回文鍊錶
請判斷乙個鍊錶是否為回文鍊錶。解題思路 根據 o n 時間複雜度和 o 1 空間複雜度的要求,則不能使用堆疊。首先找到中間節點,然後反轉中間節點之後的節點,最後比較頭結點和中間節點之後元素的大小。bool solution ispalindrome listnode head 1.找到鍊錶的中間位置...