본문 바로가기
IT/알고리즘

[Leetcode]23. Merge k Sorted Lists

by 어센트 2020. 10. 6.

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