给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。
思路:
对于两个升序链表的情况,我们很容易想到只需要利用两个指针将较小的元素放入新链表再后移相应指针,直到连个链表遍历完毕。对于n个链表,自然还可以想到利用n个指针,通过比较n个指针指向的链表元素大小,将最小的指针指向的元素填入新链表并后移当前指针即可。由此我们新建vector容器存储n个指针,只要容器不为空我们就寻找最小元素的指针并后移,当相应指针为空时代表链表遍历完毕,就把这个链表从容器内移除,当容器为空时,所有链表的元素都以排好序。
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode *root = new ListNode;
root->next = NULL;
ListNode *p = root;
if(lists.empty()){
return nullptr;
}
vector<ListNode*> remainset;
for(ListNode* hnode:lists){
if(hnode != nullptr){
remainset.push_back(hnode);
}
}
int i;
while(!remainset.empty()){
int minmember = remainset[0]->val;
int index = 0;
for(i = 1; i < remainset.size(); i++){
if(remainset[i]->val < minmember){
minmember = remainset[i]->val;
index = i;
}
}
p->next = remainset[index];
remainset[index] = remainset[index]->next;
p = p->next;
p->next = nullptr;
if(!remainset[index]){
remainset.erase(remainset.begin()+index);
}
}
if(root){
return root->next;
}
return nullptr;
}
};