Merge k Sorted Lists
Total Accepted: 13489 Total Submissions: 61228 My Submissions
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
【解题思路】
1、参考 Merge Two Sorted Lists,依次归并,每个节点都至少需要扫描一次,很耗时间。
2、参考地址 LeetCode:Merge k Sorted Lists,分析的很详细。
这里采取了第二种方法。后续有时间会更新内容。
Total Accepted: 13489 Total Submissions: 61228 My Submissions
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
【解题思路】
1、参考 Merge Two Sorted Lists,依次归并,每个节点都至少需要扫描一次,很耗时间。
2、参考地址 LeetCode:Merge k Sorted Lists,分析的很详细。
这里采取了第二种方法。后续有时间会更新内容。
Java AC 516ms
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode mergeKLists(ArrayList<ListNode> lists) {
if (lists == null || lists.size() == 0) {
return null;
}
int n = lists.size();
while (n > 1) {
int k = (n + 1) / 2;
for (int i = 0; i < n / 2; i++) {
lists.set(i, mergeTwoLists(lists.get(i), lists.get(i + k)));
}
n = k;
}
return lists.get(0);
}
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode node = new ListNode(0);
ListNode point = node;
while (l1 != null && l2 != null) {
if (l1.val > l2.val) {
point.next = new ListNode(l2.val);
point = point.next;
l2 = l2.next;
} else {
point.next = new ListNode(l1.val);
point = point.next;
l1 = l1.next;
}
}
while (l1 != null) {
point.next = new ListNode(l1.val);
point = point.next;
l1 = l1.next;
}
while (l2 != null) {
point.next = new ListNode(l2.val);
point = point.next;
l2 = l2.next;
}
return node.next;
}
}
Python AC 1116ms
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# @param a list of ListNode
# @return a ListNode
def mergeKLists(self, lists):
if lists is None or len(lists) == 0:
return None
n = len(lists)
while n > 1:
k = (n + 1) / 2
for i in range(n/2):
lists[i] = self.mergeTwoLists(lists[i], lists[i+k])
n = k
return lists[0]
def mergeTwoLists(self, l1, l2):
node = ListNode(0)
point = node
while l1 is not None and l2 is not None:
if l1.val > l2.val:
point.next = ListNode(l2.val)
l2 = l2.next
else:
point.next = ListNode(l1.val)
l1 = l1.next
point = point.next
while l1 is not None:
point.next = ListNode(l1.val)
point = point.next
l1 = l1.next
while l2 is not None:
point.next = ListNode(l2.val)
point = point.next
l2 = l2.next
return node.next