当前位置:   article > 正文

合并 K 个升序链表 C++_auto cmp = [](const listnode *a, const listnode *b

auto cmp = [](const listnode *a, const listnode *b) { return a->val > b->val

给你一个链表数组,每个链表都已经按升序排列

请你将所有链表合并到一个升序链表中,返回合并后的链表。

方法1:堆

先把每个链表数组的头节点入堆(小顶堆/小根堆),然后出堆,出堆之后,哪个数组的头节点先出堆,就要补充哪个数组的头节点。就这样一直补充下去,知道所有的节点被遍历完。

  1. class Solution {
  2. public:
  3. ListNode* mergeKLists(vector<ListNode*>& lists) {
  4. auto cmp = [](const ListNode *a, const ListNode *b){
  5. return a->val > b->val;
  6. };
  7. priority_queue<ListNode*, vector<ListNode*>, decltype(cmp)> pq;
  8. for (auto head: lists)
  9. if (head) pq.push(head);
  10. auto dummy = new ListNode();
  11. auto cur = dummy;
  12. while (!pq.empty()){
  13. auto node = pq.top();
  14. pq.pop();
  15. if (node->next)
  16. pq.push(node->next);
  17. cur->next = node;
  18. cur = cur->next;
  19. }
  20. return dummy->next;
  21. }
  22. };

priority_queue的语法需要注意,首先构建了一个lambda函数。

方法2,归并

把链表数组均分,直到剩余1个数组,分开之后合并,利用基础的合并两个有序链表的算法,再合并上去。

  1. class Solution {
  2. ListNode *mergeTwoLists(ListNode *list1, ListNode *list2) {
  3. auto dummy = new ListNode(); // 用哨兵节点简化代码逻辑
  4. auto cur = dummy; // cur 指向新链表的末尾
  5. while (list1 && list2) {
  6. if (list1->val < list2->val) {
  7. cur->next = list1; // 把 list1 加到新链表中
  8. list1 = list1->next;
  9. } else { // 注:相等的情况加哪个节点都是可以的
  10. cur->next = list2; // 把 list2 加到新链表中
  11. list2 = list2->next;
  12. }
  13. cur = cur->next;
  14. }
  15. cur->next = list1 ? list1 : list2; // 拼接剩余链表
  16. return dummy->next;
  17. }
  18. // 合并从 lists[i] 到 lists[j-1] 的链表
  19. ListNode *mergeKLists(vector<ListNode *> &lists, int i, int j) {
  20. int m = j - i;
  21. if (m == 0) return nullptr; // 注意输入的 lists 可能是空的
  22. if (m == 1) return lists[i]; // 无需合并,直接返回
  23. auto left = mergeKLists(lists, i, i + m / 2); // 合并左半部分
  24. auto right = mergeKLists(lists, i + m / 2, j); // 合并右半部分
  25. return mergeTwoLists(left, right); // 最后把左半和右半合并
  26. }
  27. public:
  28. ListNode *mergeKLists(vector<ListNode *> &lists) {
  29. return mergeKLists(lists, 0, lists.size());
  30. }
  31. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/960086
推荐阅读
相关标签
  

闽ICP备14008679号