回文链表

题目

请判断一个链表是否为回文链表。

示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true

进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

解题思路

这个题虽然知道肯定是要反转链表,但是一直不知道怎么在空间复杂度为1的情况下做到,应该说不知道怎么找到中间点,然后看了别人的解题思路才意识到快慢指针的用法。

快指针每次移动2格,慢指针每次移动一格,当快指针无法移动的时候,慢指针就到了中间点了。

然后慢指针开始反转链表,完成以后就可以开始遍历了

每次从慢指针完成后的结点拿出一个元素、从头结点拿出一个元素,如果相等就移动指针,否则返回False

遍历完成以后,就可以返回True

答案(一)

class Solution:
    def isPalindrome(self, head: ListNode) -> bool:
        fast = head
        slow = head
        while fast:
            fast = fast.next.next if fast.next else fast.next
            slow = slow.next
        
        p = None
        c = slow
        while c:
            t = c.next
            c.next = p
            p = c
            c = t
        
        while p:
            if p.val == head.val:
                p = p.next
                head = head.next
            else:
                return False
        
        return True

你可能感兴趣的:(回文链表)