タイトル
リストは回文であるかどうかを判断するためにリストを作成します。
例1:
输入: 1->2
输出: false
例2:
输入: 1->2->2->1
输出: true
高度:
あなたはこの問題を解決するためにO(n)の時間計算量とO(1)スペースの複雑さを使用することができますか?
答え
二つの方法:
- リンクされたリスト、配列ストアドバリューを横断し、次に比較。O(N)、O(N)の空間的な複雑さの時間複雑
- 指:比較、その後、中間点の後にリンクリストを逆転、中間点を探します。O(N)の時間計算量は、空間的複雑度はO(1)
コードにより、次のとおりです。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
from math import *
class Solution:
# # 改为数组:时间复杂度O(n),空间复杂度O(n)
# def isPalindrome(self, head: ListNode) -> bool:
# l = []
# while head:
# l.append(head.val)
# head = head.next
# return l == l[::-1]
# 指针法:时间复杂度O(n),空间复杂度O(1)。找到中点,反转中点之后的链表,再比较
def isPalindrome(self, head: ListNode) -> bool:
if not head or not head.next:
return True
# 找到中点,快指针走的路程是慢的两倍,快指针结束慢指针刚好在中间
f = s = head
while f:
s = s.next
f = f.next.next if f.next else f.next
# 反转中点之后的链表,1->2->0->2->1 ————》 1->2->0<-2<-1
c, p = s, None
while c:
n = c.next
c.next = p
p = c
c = n
# 相对比较
while p:
if head.val != p.val:
return False
head = head.next
p = p.next
return True