[Python] Leetcode 234. 팰린드롬 연결 리스트
Leetcode 234 팰린드롬 연결 리스트
문제
연결 리스트가 팰린드롬 구조인지 판별하라.
입력
head = [1,2,2,1]
출력
True
풀이
1. 리스트 변환
- 팰린드롬 여부를 판별하기 위해서는 앞뒤로 모두 추출할 수 있는 자료구조가 필요하다.
- 파이썬의 리스트는 pop()함수에 인덱스를 지정할 수 있어 마지막 요소가 아니라도 얼마든지 원하는 위치를 자유롭게 추출할 수 있다.
- q.pop(0) 에서 시간 복잡도가
O(N)
이 발생한다.
# node4 = ListNode(4) # 마지막 노드 (next가 None)
# node3 = ListNode(3, node4) # node3의 next가 node4를 가리킴
# node2 = ListNode(2, node3) # node2의 next가 node3을 가리킴
# node1 = ListNode(1, node2) # node1의 next가 node2를 가리킴
def isPalindrome(self, head: ListNode) -> bool:
q: List = []
if not head:
return True
node = head
# 리스트 변환
while node is not None:
q.append(node.val)
node = node.next
# 펠린드롬 판별
while len(q) > 1:
if q.pop(0) != q.pop():
return False
return True
2. deque를 이용한 최적화
- 맨 앞의 데이터를 가져올 떄
O(n)
이내에 처리할 수 있는 자료형이 필요하다. - 파이썬의 데크는 이중 연결 리스트 구조로 양쪽 방향 모두 추출하는데 시간 복잡도
O(1)
에 실행된다.
def isPalindrome(self, head: ListNode) -> bool:
q: Deque = collections.deque()
if not head:
return True
node = head
# 리스트 변환
while node is not None:
q.append(node.val)
node = node.next
# 펠린드롬 판별
while len(q) > 1:
if q.popleft() != q.pop():
return False
return True