题解 | #合并k个已排序的链表#
合并k个已排序的链表
http://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6
一种很简单的想法是将列表中的链表逐一和nullptr合并,但这样子时间复杂度很高。注释部分即为。
另一种明显的思路则是借鉴分治,将列表中的链表两两合并,最后返回结果。
/* 合并 k 个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。 */ class Solution { ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if (!l1 && !l2) return l1; if (!l1) return l2; if (!l2) return l1; if (l1->val < l2->val) { l1->next = mergeTwoLists(l1->next, l2); return l1; } else { l2->next = mergeTwoLists(l1, l2->next); return l2; } } ListNode* merge(vector<ListNode*>& lists, int l, int r) { if (l == r) return lists[l]; auto list1 = merge(lists, l, (l + r) / 2); auto list2 = merge(lists, (l + r) / 2 + 1, r); return mergeTwoLists(list1, list2); } public: ListNode* mergeKLists(vector<ListNode*>& lists) { if (!lists.size()) return nullptr; if (lists.size() == 1) return lists[0]; return merge(lists, 0, lists.size() - 1); // ListNode* res=nullptr; // for(ListNode* node:lists){ // res=mergeTwoLists(res, node); // } // return res; } };