1、存储再反转
# 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: ListNode) -> bool:
# O(n) O(n)
p = head
l = list()
# 存储
while p:
l.append(p.val)
p = p.next
# 反转
lr = list(reversed(l))
if lr == l:
return True
else:
return False
2、O(1)空间复杂度反转后半部分链表
# 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: ListNode) -> bool:
fast, slow = head, head
# 快慢指针寻找中间节点
while fast.next is not None and fast.next.next is not None:
slow = slow.next
fast = fast.next.next
# O(1)反转链表,反转后半部分
curp = slow.next
prep = None
while curp:
nextp = curp.next # 把next存起来
curp.next = prep
prep = curp
curp = nextp
first_start = head
second_start = prep
result = True
# 对比
while result and second_start is not None:
if first_start.val != second_start.val:
result = False
first_start = first_start.next
second_start = second_start.next
return result
3、递归
待更...