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.
from typing import List, Optional
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
"""
Brute Force
Time complexity: O(N log N)
Space complexity: O(N)
"""
self.nodes = []
head = point = ListNode(0)
for l in lists:
while l:
self.nodes.append(l.val)
l = l.next
for x in sorted(self.nodes):
point.next = ListNode(x)
point = point.next
return head.next
κ°μ₯ μ½κ² λ μ¬λ¦΄ μ μλ Brute Force λ°©μμ΄λΌ ν μ μλ€.
리μ€νΈλ₯Ό λλ©΄μ μλ‘μ΄ λ¦¬μ€νΈμ κ°μ μΆκ°νκ³ sorted()
ν¨μλ₯Ό μ΄μ©ν΄ 리μ€νΈλ₯Ό μ λ ¬ν ν μλ‘μ΄ μ°κ²° 리μ€νΈλ₯Ό λ§λλ λ°©μμ΄λ€.
μ λ°©λ²μ μκ° λ³΅μ‘λλ sorted()
ν¨μλ‘ μ λ ¬μ νκΈ° λλ¬Έμ O(N log N)μ΄λ©°, κ³΅κ° λ³΅μ‘λλ O(N)μ΄λ€.
μ¬κΈ°μ λ§νλ N
μ 리μ€νΈμ κΈΈμ΄κ° μλ νλΌλ―Έν°λ‘ λ°μ λͺ¨λ μ°κ²°λ¦¬μ€νΈ λ
Έλμ ν©μ΄λ€.
μ°κ²° 리μ€νΈλ₯Ό μ λ ¬ν μ μλ λ°©λ² μ€ μκ° λ³΅μ‘λλ₯Ό μ€μΌ μ μλ λ°©μμ΄ λ¬΄μμ΄ μμκΉ? λ΅μ νμ΄λ€.
import heapq
from typing import List, Optional
class Solution:
def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
"""
Optimize Approach 2 by heapq
"""
h = [(l.val, idx) for idx, l in enumerate(lists) if l]
heapq.heapify(h)
head = cur = ListNode()
while h:
val, idx = heapq.heappop(h)
cur.next = ListNode(val)
cur = cur.next
node = lists[idx] = lists[idx].next
if node:
heapq.heappush(h, (node.val, idx))
return head.next
pythonμ heapq
λͺ¨λμ μ°μ μμ μκ³ λ¦¬μ¦μ ꡬνμ μ 곡νλ€.
μ°μ μμ ν μκ³ λ¦¬μ¦μ ꡬνν λͺ¨λλ‘λ priorityQueue
λ μλλ°, μ΄ λͺ¨λ λν heapq
λͺ¨λμ κΈ°λ°μΌλ‘ λ§λ€μ΄μ‘μ§λ§ λμ Thread-safe μ§μ μ¬λΆμ λ°λΌ λ€λ₯΄λ€.
priorityQueue
λ λ©ν° μ°λ λ νκ²½μμ λ°μ΄ν°λ₯Ό μμ νκ² κ΅νν΄μΌ νλ κ²½μ° μ μ©νλ©°, heapq
λ μ΄λ¬ν Thread-safe λ₯Ό μ§μνμ§λ μλλ€.
λ½νΉμ νμ§ μκΈ° λλ¬Έμ heapq
μ μλκ° λ λΉ λ₯Έ μ₯μ μ΄ μμΌλ©°, μ¬μ€μ λ©ν° μ°λ λ νκ²½μμ κ°λ°νλ κ²μ΄ μλ κ²½μ°μλ heapq
λ₯Ό λλΆλΆ μ¬μ©νλ€.
ν(min heap)μ λͺ¨λ λΆλͺ¨ λ
Έλκ° μμλ³΄λ€ μκ±°λ κ°μ κ°μ κ°λ μ΄μ§ νΈλ¦¬μ΄κΈ° λλ¬Έμ, μ°λ¦¬λ μ΄ νμ μ¬μ©ν΄μ μ°κ²° 리μ€νΈλ₯Ό μ€λ¦μ°¨μμΌλ‘ μ λ ¬νμ¬ μ¬μ©ν μ μλ€.
heapq
λͺ¨λμ heapify()
ν¨μλ₯Ό ν΅ν΄ ννλ₯Ό λ§λ€ μ μμΌλ©°, heappop()
μ ν΅ν΄ ννμμ κ°μ₯ μμ μμλ₯Ό κΊΌλΌ μ μλ€.
λ¨Όμ 리μ€νΈλ₯Ό ννλ‘ λ§λ λ€μ μμκ° μμ΄μ§ λκΉμ§ λ°λ³΅νλ©° ννμμ μμλ₯Ό κΊΌλΈλ€.
κΊΌλΈ μμλ μ°κ²° 리μ€νΈμ μΆκ°νλ©°, κΈ°μ‘΄ 리μ€νΈμμ λ€μ λ
Έλλ₯Ό κ°μ Έμ ννμ λ£λλ€.
ννμ λ¨μ μμκ° μμΌλ©΄ λ§λ€μ΄μ§ μ°κ²° 리μ€νΈμ λλ²μ§Έ λ
Έλ(head.next
)λ₯Ό 리ν΄ν΄μ£Όλ©΄ λλ€.
μ΄λ κ² κ΅¬νμ ν κ²½μ°, μκ° λ³΅μ‘λλ O(N log k)
λ‘ λͺ¨λ 리μ€νΈλ₯Ό λμμ λλ³΄λ€ λ¨μΆλ μκ°μΌλ‘ μ λ΅μ ꡬν μ μλ€.
λͺ¨λ κ²½μ°μ sorted()
λ³΄λ€ νμ μ΄μ©ν μ λ ¬μ΄ λΉ λ₯Έ κ²μ μλμ§λ§, μ΄μ κ°μ΄ λ΄λΆ μμλ₯Ό 보쑴νλ©° μ½μ
μ νλ κ²½μ°μλ ννλ₯Ό νμ©νλ κ²μ΄ λ ν¨μ¨μ μΈ λ°©λ²μ΄λ€.