반응형
# Problem
You are given an array of k linked-lists lists, each linked-list is sorted in ascending order. Merge all the linked-lists into one sorted linked-list and return it.
Constraints:
|
# My Answer
class Solution:
def _sort(self,l1,l2): # 리스트 2개를 정렬하는 함수
if l1 and l2:
if l1.val>l2.val :
l1,l2 = l2,l1
head = node = l1
l1 = l1.next
elif l1 is not None:
return l1
else:
return l2
while l1 and l2:
if l1.val>l2.val :
l1,l2 = l2,l1
node.next = l1
l1 = l1.next
node = node.next
if l1 is None:
node.next = l2
return head
def mergeKLists(self, lists: List[ListNode])->ListNode:
if lists==[]:
return
elif len(lists)==1 and lists[0]is None:
return
elif len(lists)<=1:
return lists[0]
a = lists[0]
for ll in lists[1:]: # 앞에서 부터 2개씩 정렬
a = self._sort(a,ll)
return a
# Solution 1 - 우선순위 큐를 이용한 리스트 병합
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
root = result = ListNode(None)
heap = []
# 각 연결 리스트의 루트를 힙에 저장
for i in range(len(lists)):
if lists[i]:
heapq.heappush(heap, (lists[i].val, i, lists[i]))
print(heap)
# [(1, 0, ListNode{val: 1, next: ListNode{val: 4, next: ListNode{val: 5, next: None}}}),
# (1, 1, ListNode{val: 1, next: ListNode{val: 3, next: ListNode{val: 4, next: None}}}),
# (2, 2, ListNode{val: 2, next: ListNode{val: 6, next: None}})]
# 힙 추출 이후 다음 노드는 다시 저장
while heap:
node = heapq.heappop(heap)
idx = node[1] # 중복값 구분
result.next = node[2]
result = result.next
if result.next: # 다음 노드 다시 힙에 저장
heapq.heappush(heap, (result.next.val, idx, result.next))
return root.next
heapq 모듈 사용
import heapq
# heapq 모듈
최소힙 지원 - 값이 작은 순서대로 heappop()
동일한 값은 Error - 중복된 값을 구분할 수 있는 추가 인자 필요 - 위 문제에서는 idx사용
heappush(추가할 힙, 값)
반응형
'Algorithm > LEET CODE ( 파이썬 알고리즘 인터뷰)' 카테고리의 다른 글
[LEET CODE] 771. Jewels and Stones (0) | 2021.04.05 |
---|---|
[LEET CODE] 706. Design HashMap (0) | 2021.04.05 |
❗️[LEET CODE] 641. Design Circular Deque (0) | 2021.03.31 |
[LEET CODE] 739. Daily Temperatures (0) | 2021.03.29 |
[LEET CODE] 622. Design Circular Queue (0) | 2021.03.29 |