Skip to content

234. Palindrome Linked List

Problem

Given the head of a singly linked list, return true if it is a palindrome or false otherwise.

Constraints:

  • The number of nodes in the list is in the range [1, 105].
  • 0 <= Node.val <= 9
  • Example 1:

Input: head = [1,2,2,1]
Output: true


Solve

class Solution:
    def isPalindrome(self, head: Optional[ListNode]) -> bool:
        if not head or not head.next:  # Handle empty list or single-node list
            return True

        # Helper function to reverse a linked list
        def reverse_list(node):
            before = None
            while node:
                tmp = node.next
                node.next = before
                before = node
                node = tmp
            return before

        slow, fast = head, head
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next

        if fast:  # Odd number of nodes
            slow = slow.next

        reversed_second_half = reverse_list(slow)

        # Compare the first half and the reversed second half
        while reversed_second_half:
            if head.val != reversed_second_half.val:
                return False
            head = head.next
            reversed_second_half = reversed_second_half.next

        return True

Last update : August 29, 2023
Created : August 16, 2023