-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhard_interview.py
60 lines (48 loc) · 1.57 KB
/
hard_interview.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class Link:
def __init__(self, val, next=None):
self.val = val
self.next = next
def __str__(self):
if not self.next:
return f"Link({self.val})"
return f"Link({self.val}, {self.next})"
def get_lst_val(self, lst_val):
lst_val.append(self.val)
if self.next is not None:
self.next.get_lst_val(lst_val)
return lst_val
def merge_k_linked_lists(linked_lists):
"""
Merge the given Links recursively incorporated and sorted by value
:param linked_lists: List of Links with or without next Link
:return: List of the sorted merged Links.
>>> print(merge_k_linked_lists([Link(1)]))
Link(1)
>>> print(merge_k_linked_lists([Link(2, Link(1))]))
Link(1, Link(2))
>>> print(merge_k_linked_lists([
... Link(1, Link(2, Link(5))),
... Link(3, Link(4))
... ]))
Link(1, Link(2, Link(3, Link(4, Link(5)))))
>>> print(merge_k_linked_lists([
... Link(2, Link(4)),
... Link(2, Link(1)),
... Link(3, Link(3)),
... ]))
Link(1, Link(2, Link(2, Link(3, Link(3, Link(4))))))
"""
values = [] # 0(k*n)
for link in linked_lists: # 0(k)
# lst = []
# for val in link.get_lst_val(lst):
# values.append(val)
while link: # 0(n)
values.append(link.val)
link = link.next
values.sort(reverse=True) # 0(k*n*log(k*n))
previous_lnk = None
for val in values: # 0(k*n)
lnk = Link(val, previous_lnk)
previous_lnk = lnk
return lnk # 0(k*n*log(k*n))