题目
Given a singly linked list, determine if it is a palindrome.
Example 1:
Input: 1->2
Output: false
Example 2:
Input: 1->2->2->1
Output: true
总结
思路:这题的关键是找到链表的中间节点(medium)用slow和fast两个指针,slow每次走一步,fast每次走两步,当fast为null时,slow则指向中间节点,注意考虑长度为双数和长度为单数的情况都正确切分即可。根据中间节点把链表切为两部分,将其中一部分反转,然后依次比较是否相同。
代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reserveList(self, head):
if not head:
return None
current = head;
pre = None
next = current.next
while next:
current.next = pre
pre = current
current = next
next = next.next
current.next = pre
return current
def isPalindrome(self, head):
"""
:type head: ListNode
:rtype: bool
"""
oneStep = head
twoStep = head
while twoStep:
twoStep = twoStep.next
if twoStep:
twoStep = twoStep.next
oneStep = oneStep.next
reserved = self.reserveList(oneStep)
while reserved:
if head.val != reserved.val:
return False
head = head.next
reserved = reserved.next
return True
改进方案:可以考虑在slow前进的过程同时对前半部分进行反转,然后就可以直接切分后比较了。