forked from CodingVault/LeetCodeInPython
-
Notifications
You must be signed in to change notification settings - Fork 0
/
merge_k_sorted_lists.py
68 lines (54 loc) · 1.65 KB
/
merge_k_sorted_lists.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
61
62
63
64
65
66
67
68
#!/usr/bin/env python
# encoding: utf-8
"""
merge_k_sorted_lists.py
Created by Shengwei on 2014-07-21.
"""
# https://oj.leetcode.com/problems/merge-k-sorted-lists/
# tags: easy / medium, linked-list, sorted, merge, D&C, recursion
"""
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
"""
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
def merge_sorted_list(l1, l2):
cursor = dummy_head = ListNode(0)
while l1 and l2:
if l1.val < l2.val:
cursor.next = l1
l1 = l1.next
else:
cursor.next = l2
l2 = l2.next
cursor = cursor.next
cursor.next = l1 or l2
return dummy_head.next
class Solution:
# @param a list of ListNode
# @return a ListNode
def mergeKLists(self, lists):
if len(lists) == 0:
return None
def sub_merge(left, right):
mid = (left + right) / 2
if right - left == 1:
# mid == left
return lists[left]
l1 = sub_merge(left, mid)
l2 = sub_merge(mid, right)
return merge_sorted_list(l1, l2)
return sub_merge(0, len(lists))
########## brute force ##########
class Solution:
# @param a list of ListNode
# @return a ListNode
def mergeKLists(self, lists):
if len(lists) == 0:
return None
head = lists[0]
for index in xrange(1, len(lists)):
head = merge_sorted_list(head, lists[index])
return head