234. 回文链表
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
解题思路:利用快慢指针将链表前一半进行原地翻转,然后判断翻转后的链表与原链表后半段是否一样。
Python3代码如下:
# 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
"""
# 将链表前一半进行原地翻转
reverse,fast = None,head
while fast and fast.next:
fast = fast.next.next
#这里建议将翻转链表改写成更易读懂的形式
head.next,reverse,head = reverse,head,head.next
# 后一半链表的开始节点tail与链表节点数目的奇偶有关
tail = head.next if fast else head
# 判断两个链表是否相同
result = True
while reverse and result:
result = result and reverse.val == tail.val
reverse = reverse.next
tail = tail.next
return result