题解 | #牛群的合并#
牛群的合并
https://www.nowcoder.com/practice/d0cb24e1494e4f45a4b7d1a17db0daef
// 解题思路:1、定义一个普通的链表合并函数来实现两个链表的合并; // 2、利用二分法把所给的K个链表打散为两两一组----分治的思想 // 3、再利用合并函数把每组链表合并,合并完一层再往上合并,直到顶端
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param lists ListNode类vector * @return ListNode类 */ // 解题思路:1、定义一个普通的链表合并函数来实现两个链表的合并; // 2、利用二分法把所给的K个链表打散为两两一组----分治的思想 // 3、再利用合并函数把每组链表合并,合并完一层再往上合并,直到顶端 // 先定义一个合并两个链表的函数 ListNode* MergeTwo(ListNode* h1, ListNode* h2){ ListNode* guard = new ListNode(-1); ListNode* act = guard; if(h1 == nullptr){ return h2; } else if(h2 == nullptr){ return h1; } else{ while (h1 != nullptr && h2 != nullptr) { if(h1->val > h2->val){ // 因为升序,所以需要小的 act->next = h2; h2 = h2->next; }else{ act->next = h1; h1 = h1->next; } act = act->next; } if(h1 != nullptr){ act->next = h1; }else{ act->next = h2; } return guard->next; } } // 再定义一个分片函数,把K个链表打散为两两组合,再往上合并 ListNode* FragmentSet(vector<ListNode*>& lists, int left, int right){ if(left > right){ return nullptr; } else if(left == right){ return lists[left]; } else { int midle = (left + right)/2; return MergeTwo(FragmentSet(lists, left, midle), FragmentSet(lists, midle + 1, right)); } } // 调用分片和合并函数解决问题 ListNode* mergeKLists(vector<ListNode*>& lists) { // write code here return FragmentSet(lists, 0, lists.size() - 1); } };