LeetCode每日一题----231.回文链表
题目描述
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
题目分析
对于这个题目,要求时间复杂度子啊O(n),空间复杂度为O(1)
对于回文 我们好的办法就是找出中间的节点,然后从中间开始,一个个比较,看是否是回文的
找到中间节点很简单,只要设置两个指针,快慢指针,快指针的速度是慢指针的两倍,这样当快指针到达最后的时候,慢指针这时候指的位置就是中间的位置。如果我们需要比较,还需要将后半段的链表进行反转,这样就可以实现比较了,比较反转后的与前面的是否一样,如果一样就可以返回True,如果不一样就可以立即返回False
对于链表的反转是解决本题的重点
题目解决 上代码
def isPalindrome(self, head):
"""
:type head: ListNode
:rtype: bool
"""
if not head:
return True
# 快慢指针分割链表
slow, fast = head, head
while fast.next and fast.next.next:
fast = fast.next.next
slow = slow.next
first = head
last = slow.next
slow.next = None
# 反转后半段链表
pre, cur = None, last
while cur:
tmp = cur.next
cur.next = pre
pre = cur
cur = tmp
last = pre
# 逐项对比
cur_f, cur_l = first, last
while cur_l:
if cur_f.val != cur_l.val:
return False
cur_f, cur_l = cur_f.next, cur_l.next
return True