Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Example:
Input:
[
1->4->5,
1->3->4,
2->6
]
Output: 1->1->2->3->4->4->5->6
题意:
给定若干个有序排列的单链表,返回将所有单链表合并 并且保持有序的总链表。
分析:
直接把所给单链表的元素合并到一个数列中,对数列进行排序,使用排序后的数列进行重新构建单链表,返回即可。
Code & C++
/**
* 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) {
vector<int> allElement;
for(int i=0;i<lists.size(); ++i){
ListNode *head = lists[i];
while(head!=NULL){
allElement.push_back(head->val);
head = head->next;
}
}
sort(allElement.begin(), allElement.end());
ListNode *head = new ListNode(0);
ListNode *tmp = head;
for(int i=0;i<allElement.size();++i){
ListNode *ele = new ListNode(allElement[i]);
tmp->next = ele;
tmp = ele;
}
return head->next;
}
};
结果:
Runtime: 28 ms, faster than 99.92% of C++ online submissions for Merge k Sorted Lists.
Memory Usage: 12.7 MB, less than 15.95% of C++ online submissions for Merge k Sorted Lists.
Code & Python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
res = []
for list in lists:
head = list
while head is not None:
res.append(head.val)
head = head.next
res.sort()
head = ListNode(0)
ans = head
for d in res:
tmp = ListNode(d)
ans.next = tmp
ans = tmp
return head.next
结果:
Runtime: 76 ms, faster than 85.77% of Python3 online submissions for Merge k Sorted Lists.
Memory Usage: 17.5 MB, less than 11.96% of Python3 online submissions for Merge k Sorted Lists.