当前位置 博文首页 > Sloane的博客:Leetcode 234. 回文链表
思路:
题目要求算法时间复杂度为O(n),空间复杂度O(1),采用列表存储节点值的方法不满足要求,因此提出反转链表前一半,与后一半比较的方法。
a,b一快一慢两个指针,可以很容易得到链表中间节点的位置(奇偶情况略有不同,因此用一个变量计数链表长度);并且在慢指针a遍历列表的同时将前一半链表进行翻转,然后比较反转后的链表与前一半链表是否相同
获取链表长度是为了判别后一半链表开始的起始位置,若为奇数,需要取a的下一个节点开始
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def isPalindrome(self, head):
"""
:type head: ListNode
:rtype: bool
"""
a = head
b = head
newh = None
lth = 0
while b:
b = b.next
lth += 1
if b == None:
break
else:
b = b.next
lth += 1
tmp = a.next
a.next = newh
newh = a
a = tmp
if lth%2 == 1:
a = a.next
while newh:
if newh.val != a.val:
return False
newh = newh.next
a = a.next
return True
?
cs