Skip to content

Commit fd31976

Browse files
committed
23
1 parent 42121ad commit fd31976

File tree

1 file changed

+144
-0
lines changed

1 file changed

+144
-0
lines changed

23_merge_k_sorted_lists.py

+144
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
from typing import List,Optional
2+
# Definition for singly-linked list.
3+
class ListNode:
4+
def __init__(self, val=0, next=None):
5+
self.val = val
6+
self.next = next
7+
8+
class Solution:
9+
def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
10+
if lists is None or len(lists) == 0:
11+
return None
12+
13+
if len(lists) == 1:
14+
return lists[0]
15+
16+
head = ListNode()
17+
def merge(l0, l1):
18+
t = head
19+
while l0 is not None and l1 is not None:
20+
if l0.val < l1.val:
21+
t.next = l0
22+
l0 = l0.next
23+
else:
24+
t.next = l1
25+
l1 = l1.next
26+
t = t.next
27+
28+
if l0 is not None:
29+
t.next = l0
30+
else:
31+
t.next = l1
32+
33+
return head.next
34+
35+
36+
a = lists
37+
b = []
38+
size = len(a)
39+
while size > 1:
40+
for i in range(0, size, 2):
41+
if i + 1 >= size:
42+
b.append(a[i])
43+
else:
44+
b.append(merge(a[i], a[i + 1]))
45+
a = b
46+
b = []
47+
size = len(a)
48+
49+
return a[0]
50+
51+
class Solution_recursion:
52+
def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
53+
if lists is None or len(lists) == 0:
54+
return None
55+
56+
return self.halfMerge(lists, 0, len(lists))
57+
58+
59+
def halfMerge(self, lists: List[Optional[ListNode]], rf, rt) -> Optional[ListNode]:
60+
# print("RR", convertMultiLists(lists), rf, rt)
61+
size = rt - rf
62+
if size <= 0:
63+
return None
64+
65+
if size == 1:
66+
return lists[rf]
67+
68+
if size == 2:
69+
head = ListNode(None, None)
70+
t = head
71+
l0 = lists[rf]
72+
l1 = lists[rf + 1]
73+
74+
while l0 is not None and l1 is not None:
75+
if l0.val < l1.val:
76+
t.next = l0
77+
l0 = l0.next
78+
else:
79+
t.next = l1
80+
l1 = l1.next
81+
t = t.next
82+
83+
if l0 is not None:
84+
t.next = l0
85+
else:
86+
t.next = l1
87+
88+
return head.next
89+
90+
#len(lists) > 2
91+
return self.halfMerge([self.halfMerge(lists, rf, rf + size // 2), self.halfMerge(lists, rf + size // 2, rt)], 0, 2)
92+
93+
94+
95+
if __name__ == "__main__":
96+
97+
def makeList(l: List):
98+
if l == None or len(l) == 0:
99+
return None
100+
101+
ret = ListNode(None, None)
102+
tail = ret
103+
for v in l:
104+
tail.next = ListNode(v)
105+
tail = tail.next
106+
return ret.next
107+
108+
def makeMultiLists(ls):
109+
ret = []
110+
for l in ls:
111+
ret.append(makeList(l))
112+
return ret
113+
114+
def convertList(ln):
115+
n = ln
116+
ret = []
117+
while n is not None:
118+
ret.append(n.val)
119+
n = n.next
120+
return ret
121+
122+
def convertMultiLists(ls):
123+
ret = []
124+
for ln in ls:
125+
ret.append(convertList(ln))
126+
return ret
127+
128+
def printList(ln):
129+
print(convertList(ln))
130+
131+
ll = [[0, 2, 4], [1, 2, 5], [7]]
132+
ll = [[0, 2], [1, 3]]
133+
ll = [ [1] ]
134+
ll = [ [1], [2], [3] ]
135+
ll = [[]]
136+
ll = [[1,4,5], [1,3,4], [2,6]]
137+
ls = makeMultiLists(ll)
138+
for l in ls:
139+
printList(l)
140+
s = Solution()
141+
bl = s.mergeKLists(ls)
142+
printList(bl)
143+
144+

0 commit comments

Comments
 (0)