难度:hard
解答思路:
感觉一点也不hard。。把mergesort中的merge过程扩展到k个有序列就可以了,在实现上注意一些边界的处理,比如遇到NULL值要如何反应等等
代码:
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode* head = NULL;
ListNode* p = NULL;
while(1) {
ListNode* min_val = NULL; //指向该轮循环val最小的节点,循环结束它还是空的话说明整个merge过程已经结束,直接跳出循环返回head
int min_node = -1; //最小val节点指针在vector中的位置,循环结束要去修改它
for (int i = 0; i < lists.size(); i++) {
if (min_val == NULL && lists[i] != NULL) {
min_val = lists[i];
min_node = i;
} else if (lists[i] != NULL){ //要确保lists[i]不是NULL,空的话直接会运行时错误
if (min_val->val > lists[i]->val){
min_val = lists[i];
min_node = i;
}
}
}
if (min_val == NULL) break;
if (p == NULL) {
p = min_val;
head = min_val;
} else {
p->next = min_val;
p = p->next;
}
lists[min_node] = lists[min_node]->next; //源vector中的指针向后移动
}
return head;
}
};