文章目录
- 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);}};