题解 | 合并k个已排序的链表
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ class Solution { public: // 两个有序链表排序 ListNode* merge2Lists(ListNode* p1,ListNode* p2){ // 针对两个特殊情况处理 if (p1==nullptr){ return p2; } if (p2==nullptr){ return p1; } // 双指针遍历完升序数组 ListNode* result_head=new ListNode(0); ListNode* current_ptr=result_head; while (p1 && p2) { if (p1->val<=p2->val){ current_ptr->next=p1; p1=p1->next; }else{ current_ptr->next=p2; p2=p2->next; } current_ptr=current_ptr->next; } if (p1!=nullptr) { current_ptr->next=p1; } if (p2 != nullptr){ current_ptr->next=p2; } return result_head->next; } // 归并算法划分区间函数 ListNode* splitList(vector<ListNode*>& lists,int left,int right){ if (left>right) { return nullptr; }else if (left==right) { return lists[left]; } int mid=(left+right)/2; // 使用归并思路,划分区间,然后每个区间进行排序 return merge2Lists(splitList(lists, left,mid),splitList(lists,mid+1,right)); } /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param lists ListNode类vector * @return ListNode类 */ ListNode* mergeKLists(vector<ListNode*>& lists) { // write code here return splitList(lists,0,lists.size()-1); } };
暴力算法可以参考合并两个升序链表,但是时间过不去;可以参考归并排序思路,先划分小区间然后每个小区间排序,有了思路这道题就简单了。