题目:
将K个有序的链表进行归并排序,例子:
解题思路:
方法一:
一个比较慢的方法,就是每次遍历lists中的每一个头节点,找出最小值加入到结果链表中,并将该元素从lists中“删除“,当lists中没有元素的时候,归并排序完成。
实现:
/**
* 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) {
ListNode* result = new ListNode(0);
ListNode* q = result;
int count = 0;
while(count < lists.size()) {
int location = 0;
int imin = INT_MAX;
for( int i = 0; i < lists.size(); i++) {
if(lists[i] == NULL) {
lists[i] = new ListNode(INT_MAX);
count++;
if(count == lists.size()){
return result->next;
}
continue;
}
if(lists[i]->val < imin){
imin = lists[i]->val;
location = i;
}
}
q -> next = lists[location];
q = q->next;
lists[location] = lists[location]->next;
}
return result->next;
}
};
方法二:
采用归并排序的思想,每次选择两个链表进行归并排序,一次排序之后,待归并排序的链表的个数变为原来的1/2,最后还有一个链表的时候,排序结束,得到的就是排好序的链表。
实现:
这里写代码片