方法一
将链表元素加入到一个list中,然后比较list的正序和倒序是否相等
class Solution(object):
def isPalindrome(self, head):
if not head:
return True
h = []
while head:
h.append(head.val)
head = head.next
return h == h[::-1]
时间复杂度O(n),空间复杂度O(n)
方法二
先通过快慢指针找到链表的中点,然后对中点之后的链表进行局部翻转,最后将前半部分与后半部分一一比较
class Solution(object):
def isPalindrome(self, head):
fast,slow = head,head #快慢指针
while fast and fast.next:
slow = slow.next
fast = fast.next.next
pre = None
cur = slow #此时的中点即为慢指针所指节点
while cur: #翻转后半部分
nextnode = cur.next
cur.next = pre
pre = cur
cur = nextnode
back = pre
while back and head: #前半部分与后半部分逐元素进行比较
if back.val != head.val:
return False
back = back.next
head = head.next
return True
是对于方法一的进阶,时间复杂度相同,而空间复杂度只要O(1)