请判断一个链表是否为回文链表。
示例 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
如有问题,希望大家指出!!!