Description:
题目大意:合并 K 个已经排序的链表
解题思路:
算法标签:分治
- 将 k 个链表分成两两一组
- 然后两个链表合并
- 最终递归合并成为一个链表
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
// 两个链表合并
ListNode* mergeTowLists(ListNode* list1 , ListNode* list2) {
if(list1 == NULL)
return list2;
if(list2 == NULL)
return list1;
if(list1 -> val <= list2 -> val) {
list1 -> next = mergeTowLists(list1 -> next, list2);
return list1;
}
else {
list2 -> next = mergeTowLists(list1 , list2 -> next);
return list2;
}
}
// 对每一个小组链表进行合并
ListNode* merge(vector<ListNode *> &lists , int left ,int right) {
if(left == right)
return lists[left];
if(left > right)
return nullptr;
int mid = (left + right) >> 1;
return mergeTowLists(merge(lists , left , mid) , merge(lists , mid+1 , right));
}
ListNode* mergeKLists(vector<ListNode *> &lists) {
int left = 0,right = lists.size() - 1;
return merge(lists , left , right);
}
};