题目:Given a singly linked list, determine if it is a palindrome.
Follow up:
Could you do it in O(n) time and O(1) space?
分析题目:题目要求的是一个单链表,判断是不是回文,要求用O(n)的时间复杂度,以及O(1)的空间复杂度。
第一次超时了·~哎,,利用了一个数组来存储,然后就超时了。。
# 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
"""
if head == None:
return True
node = head.next
val_list = []
val_list.append(head.val)
while node:
val_list.append(node.val)
for i in range(len(val_list)/2):
if val_list[i] != val_list[len(val_list)-1-i]:
return False
return True
写到这个时候 ,稍微感觉到了一丝丝绝望,,还是继续,想一下。。我还是很棒棒的额,想出来了呢·哈哈~~
具体的思路是判断对称点再哪里?然后对前面的反转,与对称点之后的进行比较。
# 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
"""
if head == None:
return True
node = head.next
head.next = None
if node == None:
return True
node_n = node.next
if node_n == None:
if node.val == head.val:
return True
else:
return False
while node_n:
if head.val == node.val:
if self.is2same(head, node) == True:
return True
if head.val == node_n.val:
if self.is2same(head, node_n) == True:
return True
node.next = head
head = node
node = node_n
node_n = node.next
return False
def is2same(self, node1, node2):
if node1 == None and node2 == None:
return True
if (node1 != None and node2 == None) or (node1 == None and node2 != None):
return False
while node1!= None and node2 != None:
if node1.val == node2.val:
node1 = node1.next
node2 = node2.next
else:
return False
if node1 == node2:
return True