文章目录
- 1. 题目描述
- 2. 解题思路
- 3. 代码实现
1. 题目描述
2. 解题思路
多个链表的合并本质上可以看成两个链表的合并,只不过需要进行多次。最简单的方法就是一个一个链表,按照合并两个有序链表的思路,循环多次就可以了。
另外一个思路,我们已经可以完成两个链表的合并了,那么这个工作就可以抽象出来,不去考虑这个工作 (将它看成一个数字)。那么问题就转化成了将一个数组中的两两值(链表)进行合并。
因此我们就可以采用归并排序的思想,分治。其原理就是先两两进行合并,比如:下标为1和2的合并,3和4的合并,依次类推。
3. 代码实现
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
ListNode* Merge(ListNode* head1, ListNode* head2) {
if(head1 == nullptr) return head2;
if(head2 == nullptr) return head1;
ListNode* cur1 = head1, *cur2 = head2;
ListNode *head = new ListNode(-1);
ListNode *cur = head;
while(cur1 && cur2)
{
if(cur1->val < cur2->val)
{
cur->next = cur1;
cur1 = cur1->next;
}
else
{
cur->next = cur2;
cur2 = cur2->next;
}
cur = cur->next;
}
if(cur1)
cur->next = cur1;
if(cur2)
cur->next = cur2;
return head->next;
}
ListNode* Merge1(vector<ListNode*>& lists, int left, int right)
{
if(left == right) return lists[left];
int mid = left + (right - left) / 2;
return Merge(Merge1(lists, left, mid), Merge1(lists, mid + 1, right));
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size() == 0) return nullptr;
return Merge1(lists, 0, lists.size() - 1);
}
};