解题思路:
简单的可以直接把所有数字提出来观察是不是回文即可,我们这里只讲一下进阶解法,可以将该链表切开切成两半,根据是奇数长度还是偶数长度自己微调一下即可,然后将其中的一段翻转,然后与另一端比较,如果依次val都相同,说明是回文,否则不是回文,这样做的时间复杂度是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):
def isPalindrome(self, head):
"""
:type head: ListNode
:rtype: bool
"""
#切成两段,将一段反转,然后相等就返回true 否则返回false
if not head or not head.next:
return True
length = 0
ptr = head
while ptr:
length += 1
ptr = ptr.next
#singular
if length % 2 == 1:
stride = (length + 1) // 2
half = length // 2
else:
stride = length // 2
half = length // 2
ptr1 = head
ptr2 = head
for i in range(stride):
ptr2 = ptr2.next
pre = None
cur = ptr2
follow = cur.next
while cur:
cur.next = pre
pre = cur
cur = follow
if follow:
follow = follow.next
for i in range(half):
if pre.val != ptr1.val:
return False
else:
pre = pre.next
ptr1 = ptr1.next
return True