美文网首页
234. Palindrome Linked List

234. Palindrome Linked List

作者: 15plus | 来源:发表于2019-08-27 23:11 被阅读0次

原题链接:https://leetcode.com/problems/palindrome-linked-list/

我自己的想法是把这个链表复制一份然后倒过来,对比一下两个链表是否一样。想法简单但是操作起来非常复杂···链表的复制和比较都用自定义func来实现的。
顺便总结一下copy.copy和copy.deepcopy的区别

a = [1,2,3]
b = copy.copy(a)
c = copy.deepcopy(a)

在上面两个复制的值b和c中,b里储存的实际上是指向a的地址,一旦a改变b也会随之改变;而c储存的是a的复制值,不会随着a的改变而改变。

The difference between shallow and deep copying is only relevant for compound objects (objects that contain other objects, like lists or class instances):

A shallow copy constructs a new compound object and then (to the extent possible) inserts references into it to the objects found in the original.

A deep copy constructs a new compound object and then, recursively, inserts copies into it of the objects found in the original.

class Solution:
    def isPalindrome(self, head: ListNode) -> bool:
        if not head or not head.next:
            return True
        return self.compare(self.dpy_ll(head), self.reverse(head))
    
    def compare(self, a, b):
        while a and b:
            if a.val == b.val:
                a,b = a.next, b.next
            else:
                return False
        #handle a b have different length
        if b == None and a != None:
            return False
        elif b != None and a == None:
            return False
        else:
            return True
        
    def dpy_ll(self, head):
        dummy = ListNode(-1)
        curr = head
        prev = dummy
        while curr:
            curr_dpc = copy.copy(curr)
            prev.next = curr_dpc
            curr = curr.next
            prev = curr_dpc
        return dummy.next
    
    def reverse(self, head):
        prev = None
        curr = head
        while curr:
            next_ = curr.next
            curr.next = prev
            prev = curr
            curr = next_
        return prev
        

看了讨论里别人写的答案,太厉害了,其实问题的关键在于值是否相等,所以直接将链表上的值复制下来然后倒过来对比就好,简单了很多速度也更快。

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

相关文章

网友评论

      本文标题:234. Palindrome Linked List

      本文链接:https://www.haomeiwen.com/subject/vxnyectx.html