Leetcode 234:回文链表(最详细解决方案!!!)

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false

示例 2:

输入: 1->2->2->1
输出: true

进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

解题思路

我们首先想到的思路是通过建立一个list,然后将链表中的数存进去,然后判断这个list是否回文。但是这样做的空间复杂度是O(n),显然无法满足空间复杂度O(1)的需求。

我们可以建立快慢指针,通过这两个指针获得两个列表,参看这篇文章Leetcode 143:重排链表(最详细解决方案!!!)

 1 -> 2 -> 2 -> 1 -> null
     pre       lat

然后我们将pre右侧链表reverse,然后比较链表的每个元素是不是一样。这里我们不需要关注链表是奇数还是偶数,大家可以想一下为什么?

class Solution:
    def isPalindrome(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        if head == None or head.next == None:
            return True

        lat = head.next
        pre = head
        while lat != None and lat.next != None:
            lat = lat.next.next
            pre = pre.next

        cur = pre.next
        pre.next = None
        p = None
        while cur != None:
            q = cur.next
            cur.next = p
            p = cur
            cur = q

        while p != None and head != None:
            if p.val != head.val:
                return False
            p = p.next
            head = head.next

        return True

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页