1、归并
这道题的前置题目是LeetCode-21-合并两个有序链表,在完成了前置题目的基础上,我们可以用到先前的结果来实现k个链表的排序,其中最方便的方法就是对k个链表进行归并排序,这样每次是两个链表进行两两排序,就能大大简化我们的设计实现。
在进行归并排序时,我们需要注意归并的特殊情况:1、由于我们使用下标规定归并的对象,因此我们在进行归并排序时需要考虑最小的子结果,即两个下标相同的情况,此时我们不需要进行排序只要返回链表指针即可;2、在上一种情况的前提下,此时我们返回了两个链表指针,此时我们只需要对这两个链表进行排序即可,这时我们就可以使用先前的结果从而方便设计。
class Solution {
public:
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
ListNode *dummy = new ListNode(0);
ListNode *cur = dummy;
while (l1 != nullptr && l2 != nullptr) {
ListNode **pp = (l1->val < l2->val) ? &l1 : &l2;
cur->next = *pp;
cur = cur->next;
*pp = (*pp)->next;
}
cur->next = (l1 == nullptr) ? l2 : l1;
ListNode *ans = dummy->next;
delete dummy;
return ans;
}
ListNode *merge(vector<ListNode *> lists, int start, int end) {
if (start == end) {
return lists[start];
}
int mid = (start + end) / 2;
ListNode *l1 = merge(lists, start, mid);
ListNode *l2 = merge(lists, mid + 1, end);
return mergeTwoLists(l1,l2);
}
ListNode *mergeKLists(vector<ListNode *> &lists) {
if (lists.size() == 0) {
return nullptr;
}
ListNode* result = merge(lists, 0, lists.size() - 1);
return result;
}
};