有人可以告诉我为什么这是错误的吗?

时间:2020-10-06 13:07:57

标签: python

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def isPalindrome(self, head: ListNode) -> bool:
        
        if head == self.reverse(head):
            return True
        return False
        
    
    def reverse(self, head):
        if not head or not head.next:
            return head
        
        cur = head
        prev = None
        
        while cur:
            tmp = cur.next
            cur.next = prev
            
            prev = cur
            cur = tmp
            
        return prev

在测试用例[0,0]上,结果将是错误的,但对于其他情况,结果是正确的。这是leetcode234。

2 个答案:

答案 0 :(得分:1)

您的解决方案的总体思路似乎是反转链接列表并进行比较,以查看它是否等于原始链接列表。

那么,一个问题是,尽管您解决方案的reverse方法看起来像正确地反向了一个链表,但它却是破坏性的:因为它会更改所有节点指针,所以原始链表回来的时候消失了。返回后,您将获得一个反向链接列表,但是您将没有原始链接列表来将其与其他列表进行比较!解决此问题的一种方法可能是创建并返回一个新的链表,该链表是您传递给reverse的链表的反转。

假设您已解决此问题,第二个问题是(除非LeetCode在幕后进行的工作比在这里提到的要多),==在两个ListNode之间不会做任何有用的事情,因为它只是调用类上的__eq__方法,没有人定义。如果要检查两个链表是否相等,就意味着它们具有相同的值,并且顺序相同,则可能必须定义自己的方法或函数才能逐个节点地,逐个值地进行处理。

答案 1 :(得分:0)

不确定在您的代码中我们在哪里检查回文。

对于这个问题,我们可以简单地进行遍历并使用A == A[::-1]返回以检查回文(在Python中):

class Solution:
    def isPalindrome(self, head):
        vals = []
        while head:
            vals.append(head.val)
            head = head.next
        return vals == vals[::-1]