Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
由题意得,就是给出K个排序好的链表序列,然后把它们都合并起来。因为这一题的上一个题目是merge two sorted lists,所以每次都合并两个序列,然后就可以了,但是显然这样时间复杂度比较高,大概为O(k*n),其中n为链表的平均长度,代码如下。
Code(LeetCode运行293ms)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
if (lists.size() == 0) {
return NULL;
}
ListNode *p = lists[0];
for (int i = 1; i < lists.size(); i++) {
p = mergeTowLists(p, lists[i]);
}
return p;
}
ListNode* mergeTowLists(ListNode* l1, ListNode* l2) {
ListNode head(INT_MIN);
ListNode *pointer = &head;
while (l1 != NULL && l2 != NULL) {
if (l1 -> val <= l2 -> val) {
pointer -> next = l1;
l1 = l1 -> next;
} else {
pointer -> next = l2;
l2 = l2 -> next;
}
pointer = pointer -> next;
}
if (!l1) {
pointer -> next = l2;
} else {
pointer -> next = l1;
}
return head.next;
}
};
其实还可以进一步减少一点复杂度,例如是先把序列中的链表先两两合并,然后再合并,一直到合并成一个序列,这样的话时间复杂度为O(k*logn),具体代码不写了,因为也是复用了mergeTwoSortedLists,改一下主函数里的代码就好了。