Merge k Sorted Lists - LeetCode
풀이 1
가장 먼저 쉬운 방법인 리스트에 모든 연결리스트를 순회하여 저장 후 정렬한 다음 다시 리스트로 만들어 리턴해주는 방법으로 해결했다.
from typing import List
class ListNode:
def __init__(self,val = 0, next = None):
self.val = val
self.next = next
class Solution:
def mergeKLists(self,lists:List[ListNode])->ListNode:
data = []
for list in lists:
while list:
data.append(list.val)
list = list.next
data = sorted(data)
root = temp = ListNode()
for i in data:
temp.next = ListNode(i)
temp = temp.next
return root.next
풀이 2
우선순위 큐를 이용해서 문제를 해결하는 방법이다.
파이썬에서 우선순위 큐를 이용하는 방법은 PriorityQueue 클래스와 heapq클래스가 있다.
주로 heapq를 이용해 구현하는 경우가 많기 때문에 heapq로 풀이를 작성했다
파이썬에서 heap은 기본적을 min-heap이다
def mergeKLists2(self,lists:List[ListNode])->ListNode:
import heapq
heap = []
root = result = ListNode()
#각 연결리스트의 루트를 힙에 저장
for i in range(len(lists)):
if lists[i]:
heapq.heappush(heap,(lists[i].val,i,lists[i]))
# 힙 추출 이후 다음 노드는 다시 저장
while heap:
node = heapq.heappop(heap)
idx = node[1]
result.next = node[2]
result = result.next
if result.next: # 다음노드가 None이 아닌경우
heapq.heappush(heap,(result.next.val,idx,result.next))
return root.next
'IT > 알고리즘' 카테고리의 다른 글
[Leetcode]706. Design HashMap (1) | 2020.10.07 |
---|---|
[BOJ]1874.스택 수열 (0) | 2020.10.07 |
[Leetcode]641. Design Circular Deque (0) | 2020.10.06 |
[Leetcode]622. Design Circular Queue (0) | 2020.10.06 |
[Leetcode]232. Implement Queue using Stacks (0) | 2020.10.06 |