[Algorithm] LeetCode #234 - Palindrome Linked List


개요

LeetCode #234, Palindrome Linked List 문제를 풀어봅니다.

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

Example 1:

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

Example 2:

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

Constraints:

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

Follow up: Could you do it in O(n) time and O(1) space?

ListNode(linked list)에서 value를 뽑아서 리스트에 넣어 리스트로 바꾸고 pop으로 비교하는 방법이 있고, 리스트 대신 데크로 바꾸어 같은 일을 하는 방법이 있습니다. 리스트로 바꾸고 pop을 하면 한 칸씩 모든 값이 옮겨지면서 O(n)이 되고, 데크로 하면 O(1)이라 데크가 유리하다고 합니다.


import collections

# Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
        
class Solution:
    def isPalindrome(self, head: ListNode) -> bool:
        q = []
        
        if not head:
            return True
        
        # ListNode(linked list): Head -> value/next -> value/next -> ...
        node = head
        # covert to list
        while node is not None:
            q.append(node.val)
            node = node.next
            
        # palindrome?
        while len(q) > 1:
            if q.pop(0) != q.pop():
                return False
        
        return True
    
    def isPalindrome_ver2(self, head: ListNode) -> bool:
        # deque
        q = collections.deque()
        
        if not head:
            return True
        
        # ListNode(linked list): Head -> value/next -> value/next -> ...
        node = head
        # covert to list
        while node is not None:
            q.append(node.val)
            node = node.next
            
        # palindrome?
        while len(q) > 1:
            # deque is faster than linked list -> list
            if q.popleft() != q.pop():
                return False
        
        return True






© 2021.03. by JacobJinwonLee

Powered by theorydb