题目描述:
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)空间复杂度完成吗?
解题思路:
1). 使用快慢指针寻找链表中点
2). 将链表的后半部分就地逆置,然后比对前后两半的元素是否一致
3). 恢复原始链表的结构(可选)
Python代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# @param {ListNode} head
# @return {boolean}
def isPalindrome(self, head):
if head is None:
return True
#find mid node
fast = slow = head
while fast.next and fast.next.next:
slow = slow.next
fast = fast.next.next
#reverse second half
p, last = slow.next, None
while p:
next = p.next
p.next = last
last, p = p, next
#check palindrome
p1, p2 = last, head
while p1 and p1.val == p2.val:
p1, p2 = p1.next, p2.next
#resume linked list(optional)
p, last = last, None
while p:
next = p.next
p.next = last
last, p = p, next
slow.next = last
return p1 is None
本文链接:http://bookshadow.com/weblog/2015/07/10/leetcode-palindrome-linked-list/
请尊重作者的劳动成果,转载请注明出处!书影博客保留对文章的所有权利。