请判断一个链表是否为回文链表。
示例 1:
输入: 1->2 输出: false
示例 2:
输入: 1->2->2->1 输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
解决方案:为了满足O(n)时间复杂度、O(1)空间复杂度的要求,只能在原址进行操作(不能借用太多辅助内存),
因此需要将中点之后的链表进行翻转,再遍历比较两段链表:
步骤:
(1):寻找链表中点
(2):翻转链表
(3):遍历比较
以上三步,每一步时间复杂度均为O(n),总的为O(n)
class Solution:
def isPalindrome(self, head):
"""
:type head: ListNode
:rtype: bool
"""
if not head or not head.next :
return True
#寻找中间节点:
slowNode = fastNode = head
while fastNode and fastNode.next:
slowNode = slowNode.next
fastNode = fastNode.next.next
if fastNode:
middleNode = slowNode.next
else:
middleNode = slowNode
#翻转后半段链表:
secondHead = self.reverseList(middleNode)
#遍历、判断
while secondHead:
if head.val == secondHead.val:
head = head.next
secondHead = secondHead.next
else:
return False
return True
#翻转链表
def reverseList(self, node):
if node.next == None:
return node
headNode = self.reverseList(node.next)
node.next.next = node
node.next = None
return headNode