Python中带有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

这就是#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

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您的参数占用空间。这个空间在列表的长度上是线性的,这和我提出的解决方案是一样的。如果不重写列表,我看不到任何解决方法。这是我想出的同一个解决方案。如果不重写列表,我想不出任何解决方法。