回文链表
描述
简单
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
解题
首先通过快慢指针找到链表的中点
然后逆序后一部分
再与前一部分进行一一比较
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def isPalindrome(self, head: ListNode) -> bool:
fast = slow = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
cur = None
pre = None
# 如果fast存在,说明链表的节点为奇数个
# slow所在位置为中间的位置,不需要进行比较
if fast:
cur = slow.next
else:
cur = slow
# 将后一部分链表逆序
while cur:
temp = cur.next
cur.next = pre
pre = cur
cur = temp
# 一个一个进行比较
while pre:
if pre.val == head.val:
pre = pre.next
head = head.next
else:
return False
return True