题解 | #合并k个已排序的链表#

合并k个已排序的链表

https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6

#include <algorithm>
#include <vector>

class Solution {
 public:
  /**
   * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
   *
   * @ comment:
   * 1. 该问题的关键是使用堆函数,实现logN的排序; 同时对Comp比较的本质有所体会。
   * 2. 默认的comp是使用less<>()完成大堆序,即<,若要实现小堆序,就要用>=。
   * 3. 初始化堆的使用make_heap,之后的pop_heap和push_heap其内部都存在make_heap操作;
   * 4. 还有就是这三者的Comp需要一致;
   * @param lists ListNode类vector
   * @return ListNode类
   */
  ListNode* mergeKLists(vector<ListNode*>& lists) {
    if (lists.empty()) return nullptr;
    std::vector<ListNode*> data;
    auto Comp = [](const ListNode * lhs, const ListNode * rhs) {
      return lhs->val >= rhs->val;
    };
    for (auto& item : lists) {
      if (item == nullptr) continue;
      data.push_back(item);
    }

    auto head = new ListNode(-1);
    auto p = head;
    std::make_heap(data.begin(), data.end(), Comp);
    while (!data.empty()) {
      std::pop_heap(data.begin(), data.end(), Comp);
      auto min_value = data.back();
      p->next = min_value;
      p = p->next;
      if (min_value->next == nullptr)
        data.pop_back();
      else
        data.back() = min_value->next;
      std::push_heap(data.begin(), data.end(), Comp);
    }

    auto ret = head->next;
    delete head;
    return ret;
  }
};

#每天刷题#
全部评论

相关推荐

2本硕,在这一个下午真的绷不住了,浪费了太多时间,现在的技术栈还停在C语言和stm32上,找嵌入式的实习面试被拷打,找杭州的一个也找不到,真的心里难受,linux没学过,研二了开始慌了。
一条淡水魚:嵌入式这行的面试我认为实际项目比较重要,技术栈简单的提一嘴就行,面试官在乎的关键点在于你用了这些技术做了哪些工作解决了什么问题,而不是停留在离散的那些个技术栈上,那除了教课没有意义,好比你提到的c语言和32,你用32做过哪些具体的项目?接触过什么外设?使用过哪些公司的SDK?有没有实际产品落地?以及各种只有进入真正的生产环节当中才会积累到的经验......主动去和面试官讨论这些实际的问题,甚至还能就某个具体参数的合理性与他去简单探讨一下,只要技术栈对口,基本上就稳啦~(另外linux和RTOS是嵌入式的标配哦,选一个方向走下去吧)
点赞 评论 收藏
分享
李橙子:结果虽不够理想,但过程本身已是宝贵的淬炼。能把学习机会放在薪酬之前,证明你目光长远。先踏实进去,用这段时间扎实学好Python后端,把公司项目吃透,你的价值会在下一份工作中完全体现。这个起点,值得。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务