归并排序 + 合并两个有序链表,简单易理解
合并k个已排序的链表
http://www.nowcoder.com/questionTerminal/65cfde9e5b9b4cf2b6bafa5f3ef33fa6
class Solution {
public:
ListNode* help(ListNode* a, ListNode* b){
if(a == nullptr || b == nullptr) return a == nullptr ? b : a;
ListNode* head, *last, *i, *j;
if(b->val > a->val){head = last = a; i = a->next; j = b;}
else {head = last = b; i = a; j = b->next;}
while(i != nullptr && j != nullptr){
if(i->val < j->val){last->next = i; i = i->next;}
else{last->next = j; j = j->next;}
last = last->next;
}
last->next = i == nullptr ? j : i;
return head;
}
ListNode* merge(vector<ListNode*> lists, int l, int r){
if(l > r) return nullptr;
if(l == r) return lists[l];
auto i = merge(lists, l, (l + r) / 2);
auto j = merge(lists, (l + r) / 2 + 1, r);
return help(i, j);
}
ListNode *mergeKLists(vector<ListNode *> &lists) {
int size = lists.size();
if(size == 0) return nullptr;
if(size == 1) return lists[0];
return merge(lists, 0, size - 1);
}
};
查看18道真题和解析