此题解采用了快慢指针法来找到链表的中点,并在此过程中反转链表的前半部分。快指针每次移动两步,慢指针每次移动一步。当快指针到达链表末尾时,慢指针则位于中点。若链表长度为奇数,慢指针还需前进一步。之后,从中点将链表分为前后两部分,前半部分已在移动时被反转。然后分别从前半部分和后半部分的头部开始比较,若所有对应节点值相等,则链表为回文链表。
时间复杂度: O(n)
空间复杂度: 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:
if not head: return True # 如果链表为空,直接返回True
# 初始化快慢指针和前序节点
fast, slow, prev = head, head, None
# 使用快慢指针找到中点,同时反转前半部分链表
while fast.next and fast.next.next:
fast = fast.next.next
temp = slow.next
slow.next, prev, slow = prev, slow, temp
# 调整指针,准备比较回文
if fast.next:
fast = slow.next
slow.next = prev
else:
fast = slow.next
slow = prev
# 比较前半部分和后半部分是否相等
while slow:
if fast.val != slow.val:
return False
fast, slow = fast.next, slow.next
return True