leetcode234 回文鍊錶

2021-09-20 18:34:59 字數 2531 閱讀 9220

請判斷乙個鍊錶是否為回文鍊錶。

示例 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.找到鍊錶的中間位置...