11from __future__ import annotations
22
3- from typing import Generic
3+ from typing_extensions import TypeAlias
44
55from book .data_structures import Array
66from book .data_structures import KeyObject
77from book .data_structures import PriorityQueue
8- from book .data_structures import T
98from solutions .chapter6 .section5 .exercise3 import min_heap_extract_min
109from solutions .chapter6 .section5 .exercise3 import min_heap_insert
1110from util import range_of
1211
1312
1413# TODO(#20) replace by the general list node and list classes once they will have been added
15- class SortedListNode ( Generic [ T ]) :
16- key : T
17- next : SortedListNode [ T ] | None = None
14+ class SortedListNode :
15+ key : float
16+ next : SortedListNode | None = None
1817
1918
20- class SortedList ( Generic [ T ]) :
21- head : SortedListNode [ T ] | None = None
19+ class SortedList :
20+ head : SortedListNode | None = None
2221
2322
24- def merge_sorted_lists (sorted_lists : Array [SortedList [T ]], k : int ) -> SortedList [T ]:
23+ NodePayloadType : TypeAlias = tuple [SortedListNode , SortedList ]
24+
25+
26+ def merge_sorted_lists (sorted_lists : Array [SortedList ], k : int ) -> SortedList :
2527 """Merges sorted lists into one sorted list.
2628
2729 Args:
@@ -31,24 +33,26 @@ def merge_sorted_lists(sorted_lists: Array[SortedList[T]], k: int) -> SortedList
3133 Returns:
3234 The sorted list containing all elements from the input sorted lists.
3335 """
34- Q = PriorityQueue (k )
36+ Q = PriorityQueue [ NodePayloadType ] (k )
3537 for i in range_of (1 , to = k ):
3638 sorted_list = sorted_lists [i ]
3739 if sorted_list .head is not None :
3840 x = sorted_list .head
3941 sorted_list .head = sorted_list .head .next
4042 x .next = None
41- min_heap_insert (Q , KeyObject (key = x .key , data = (x , sorted_list )), k )
42- merged_list = SortedList [ T ] ()
43- tail = None
43+ min_heap_insert (Q , KeyObject [ NodePayloadType ] (key = x .key , data = (x , sorted_list )), k )
44+ merged_list = SortedList ()
45+ tail : SortedListNode | None = None
4446 while Q .heap_size > 0 :
45- element , list_ = min_heap_extract_min (Q ).data
47+ head_object = min_heap_extract_min (Q )
48+ element , list_ = head_object .data
4649 if merged_list .head is None :
4750 tail = merged_list .head = element
4851 else :
52+ assert tail is not None
4953 tail .next = element
5054 tail = tail .next
5155 if list_ .head is not None :
52- min_heap_insert (Q , KeyObject (key = list_ .head .key , data = (list_ .head , list_ )), k )
56+ min_heap_insert (Q , KeyObject [ NodePayloadType ] (key = list_ .head .key , data = (list_ .head , list_ )), k )
5357 list_ .head = list_ .head .next
5458 return merged_list
0 commit comments