心路历程:
一开始想到用栈,但是发现还是得到中点后才开始判断,时间空间没什么区别,还不如直接获取数组后正逆对比;
看了网上的O(1)空间复杂度方法,意思是按照奇数偶数判断完之后,利用快慢指针让快指针到终点时慢指针到中间,然后开始把链表后半段依次翻转,然后再依次去判断。看着有点麻烦就没写这种做法,应该也不难。
注意的点:
1、注意用栈直接push然后遇到相同的pop的话只能去重不能判断回文
2、快慢指针的做法记得分奇数偶数
3、链表是可以通过修改顺序从而降低访问的时间复杂度的
4、回文数组可以直接用原数组和拟数组是否一致来判断,不用分成两半再去对比。
解法:
# 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: Optional[ListNode]) -> bool:
# O(n)是可以遍历两遍的,没必要用栈
n = 0
record = []
while head:
n += 1
record.append(head.val)
head = head.next
# half = n // 2
# if n % 2 == 0: return record[:half] == record[half:][::-1]
# else: return record[:half] == record[half+1:][::-1]
return record == record[::-1] # 可以直接用原数组和逆数组是否一致来判断