Python中带有O(1)额外空间的回文链表
这就是#234 Leetcode问题: 给定一个单链表,确定它是否是回文 跟进:你能在O(n)时间和O(1)空间内完成吗 这个问题用O(n)空间很容易解决。然而,我无法找出O(1)解。我想到的唯一方法是使用递归:Python中带有O(1)额外空间的回文链表,python,algorithm,linked-list,palindrome,Python,Algorithm,Linked List,Palindrome,这就是#234 Leetcode问题: 给定一个单链表,确定它是否是回文 跟进:你能在O(n)时间和O(1)空间内完成吗 这个问题用O(n)空间很容易解决。然而,我无法找出O(1)解。我想到的唯一方法是使用递归: # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = None
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
current = None
def isPalindrome(self, head):
"""
:type head: ListNode
:rtype: bool
"""
if not head or not head.next:
return True
self.current = head
return self.compare(head)
def compare(self, head):
if not head: return True
if not self.compare(head.next): return False
if head.val != self.current.val:
return False
else:
self.current = self.current.next
return True
这适用于小样本,但会产生
超过最大递归深度
任何人都可以仅使用O(1)空间提供解决方案?谢谢。如果允许您就地修改列表,您可以执行以下操作:
这只需要固定的额外空间,并且具有线性执行时间。如果允许您修改列表,您可以执行以下操作:
这只需要恒定的额外空间,并且具有线性执行时间。递归也使用O(n)空间。因为这个空间是隐式分配在堆栈上的,所以它更隐藏。如果递归使用常量空间,就不会耗尽空间。@svenmarnachc您能详细解释一下吗?是什么导致了隐式分配?@molbdnilo我找不到problem@GilbertLee您的参数占用空间。该空间在列表长度上是线性的。递归也使用O(n)空间。因为这个空间是隐式分配在堆栈上的,所以它更隐藏。如果递归使用常量空间,就不会耗尽空间。@svenmarnachc您能详细解释一下吗?是什么导致了隐式分配?@molbdnilo我找不到problem@GilbertLee您的参数占用空间。这个空间在列表的长度上是线性的,这和我提出的解决方案是一样的。如果不重写列表,我看不到任何解决方法。这是我想出的同一个解决方案。如果不重写列表,我想不出任何解决方法。