题意描述:
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
思路一:先两两判断,之后输出结果。
完整C++代码如下:
class Solution {
public:
ListNode* mergeTwoLists(ListNode *a, ListNode *b){
if(!a || !b) return a ? a : b;
ListNode head;
ListNode* cur = &head;
ListNode* aPtr = a;
ListNode* bPtr = b;
while(aPtr && bPtr){
if(aPtr->val < bPtr->val){
cur->next = aPtr;
aPtr = aPtr->next;
}
else{
cur->next = bPtr;
bPtr = bPtr->next;
}
cur = cur->next;
}
cur->next = aPtr ? aPtr : bPtr;
return head.next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode* result = NULL;
for(int i = 0; i < lists.size(); i++){
result = mergeTwoLists(result, lists[i]);
}
return result;
}
};
思路二:分治法
如图所示,将输入的不同的list两两合并,之后再将得到的结果进行两两合并,直到只剩下唯一的list。
完整C++代码如下:
class Solution {
public:
ListNode* mergeTwoLists(ListNode *a, ListNode *b){
if(!a || !b) return a ? a : b;
ListNode head;
ListNode* cur = &head;
ListNode* aPtr = a;
ListNode* bPtr = b;
while(aPtr && bPtr){
if(aPtr->val < bPtr->val){
cur->next = aPtr;
aPtr = aPtr->next;
}
else{
cur->next = bPtr;
bPtr = bPtr->next;
}
cur = cur->next;
}
cur->next = aPtr ? aPtr : bPtr;
return head.next;
}
ListNode* merge(vector<ListNode*>& lists, int start, int end){
if(start == end) return lists[start];
if(start > end) return NULL;
int mid = (end - start) / 2 + start;
return mergeTwoLists(merge(lists, start, mid), merge(lists, mid + 1, end));
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
return merge(lists, 0, lists.size() - 1);
}
};
思路三:利用优先队列
完整C++代码如下:
class Solution {
private:
struct cmp {
bool operator () (ListNode *p1, ListNode *p2) {
return p1->val > p2->val;
}
};
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode head(0);
ListNode* cur = &head;
// 优先队列,最小堆
priority_queue<ListNode*, vector<ListNode*>, cmp> que;
for(ListNode* pNote : lists){
if(pNote){
que.emplace(pNote);
}
}
while(!que.empty()){
cur->next = que.top();
que.pop();
cur = cur->next;
if(cur->next){
que.emplace(cur->next);
}
}
return head.next;
}
};