合并 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

  1. 输入:
  2. [
  3.   1->4->5,
  4.   1->3->4,
  5.   2->6
  6. ]
  7. 输出: 1->1->2->3->4->4->5->6

思路:k个链表是排好序的,那我们就可以依次,按顺序的比较每个链表的节点,将最小的依次放入一个新链表中。我的做法是动态申请一个指针数组,每个链表均由一个指针指向,然后就可以比较每个链表的值,直到每个链表为空。这里注意在遍历的时候要注意判断是否为空,否则就会出现一个链表为零,还在比较它的节点大小的情况,访问出错。

  1. ListNode* mergeKLists(vector<ListNode*>& lists)
  2. {
  3. ListNode* newhead=new ListNode(0);
  4. ListNode* cur=newhead;
  5. int len=lists.size();
  6. if(len==0) return NULL;
  7. ListNode** p=new ListNode*[len];
  8. for(int i=0;i<len;i++)
  9. {
  10. p[i]=lists[i];
  11. }
  12. while(cur)
  13. {
  14. int pos=0;
  15. int min=INT_MAX;
  16. for(int i=0;i<len;i++)
  17. {
  18. if(p[i]&&min>p[i]->val )//找到最小的节点,并记录链表的下标
  19. {
  20. pos=i;
  21. min=p[i]->val;
  22. }
  23. }
  24. if(p[pos])//不为空挂在后面,否则意味着全为空了,退出
  25. {
  26. cur->next=new ListNode(p[pos]->val);
  27. p[pos]=p[pos]->next;
  28. cur=cur->next;
  29. }
  30. else
  31. break;
  32. }
  33. return newhead->next;
  34. }

其实我们可以用优先队列来完成找最小节点的任务。

  1. struct cmp {
  2. bool operator() (const ListNode* a, const ListNode* b)
  3. {
  4. return a->val > b->val;
  5. }
  6. };
  7.  
  8. class Solution {
  9. public:
  10. ListNode* mergeKLists(vector<ListNode*>& lists) {
  11. priority_queue<ListNode*, vector<ListNode*>, cmp> heap;
  12. ListNode *head = new ListNode(0);
  13. ListNode *curr = head;
  14.  
  15. auto iter = lists.begin();
  16. for (; iter != lists.end(); iter++)
  17. {
  18. if (*iter != NULL)
  19. {
  20. heap.push(*iter);
  21. }
  22. }
  23.  
  24. while (!heap.empty())
  25. {
  26. ListNode* minNode = heap.top();
  27. heap.pop();
  28. ListNode* tmp = new ListNode(minNode->val);
  29. curr->next = tmp;
  30. curr = curr->next;
  31. if (minNode->next != NULL)
  32. {
  33. heap.push(minNode->next);
  34. }
  35. }
  36.  
  37. return head->next;
  38. }
  39. };

Leetcode(23)-合并K个排序链表的更多相关文章

  1. LeetCode 23. 合并K个排序链表(Merge Two Sorted Lists)

    23. 合并K个排序链表 23. Merge k Sorted Lists 题目描述 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. LeetCode23. Merge k S ...

  2. Java实现 LeetCode 23 合并K个排序链表

    23. 合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输 ...

  3. [LeetCode]23. 合并K个排序链表(优先队列;分治待做)

    题目 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2->6 ] 输出: 1 ...

  4. [LeetCode] 23. 合并K个排序链表

    题目链接: https://leetcode-cn.com/problems/merge-k-sorted-lists/ 题目描述: 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂 ...

  5. leetcode 23. 合并K个排序链表 JAVA

    题目: 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2->6 ] 输出: ...

  6. LeetCode 23. 合并K个排序链表(Merge k Sorted Lists)

    题目描述 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2->6 ] 输出: ...

  7. LeetCode 23 ——合并 K 个排序链表

    1. 题目 2. 解答 2.1. 方法一 在 合并两个有序链表 的基础上,我们很容易想到第一种解法,首先我们将第一个链表和第二个链表合并成一个新的链表,然后再往后依次合并接下来的每个链表即可. 假设每 ...

  8. 【LeetCode】23.合并K个排序链表

    题目描述 23.合并K个排序链表 合并k个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] ...

  9. LeetCode题解-23 合并K个排序链表 Hard

    合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1-&g ...

  10. Leetcode题库——23.合并k个排序链表

    @author: ZZQ @software: PyCharm @file: mergeKLists.py @time: 2018/10/12 19:55 说明:合并 k 个排序链表,返回合并后的排序 ...

随机推荐

  1. vagrant up报错【io.rb:32:in `encode': "\x95" followed by "\"" on GBK (Encoding::InvalidByteSequenceError)】

    vagrant up报错[io.rb:32:in `encode': "\x95" followed by """ on GBK (Encoding: ...

  2. [Usaco2009 Feb]Bullcow 牡牛和牝牛

    原题链接https://www.lydsy.com/JudgeOnline/problem.php?id=3398 容易想到的一种\(dp\)就是:设\(dp[i][j]\)表示前\(i\)头牛里面有 ...

  3. 入门OJ:八中生成树2

    题目描述 八中里面有N个建设物,M条边.对于这种要建最小生成树的问题,你应该很熟练了.现在老大决定降低某条边的费用,然后这条边必须要被选中,因为这条路他每天都要走,自然......问选了这条边后是否可 ...

  4. 生僻标签 fieldset 与 legend 的妙用

    谈到 <fieldset> 与 <legend>,大部分人肯定会比较陌生,在 HTML 标签中,属于比较少用的那一批. 我最早知道这两个标签,是在早年学习 reset.css ...

  5. 关于springboot项目通过jar包启动之后无法读取项目根路径静态资源

    在一次项目开发过程中,项目根路径下存放了一张图片,生成二维码的时候调用了该图片作为二维码的logo,在windows环境下二维码可以正常生成,但是部署到生产测试环境之后二维码生成报错,FileNotF ...

  6. Flask扩展点总结(信号)

    信号(源码) 信号,是在flask框架中为我们预留的钩子,让我们可以进行一些自定义操作. pip3 install blinker 根据flask项目的请求流程来进行设置扩展点 1.中间件 from ...

  7. Py-re正则模块,log模块,config模块,哈希加密

    9.re正则表达式模块,用于字符串的模糊匹配 元字符: 第一:点为通配符 用.表示匹配除了换行符以外的所有字符 import re res=re.findall('a..x','adsxwassxdd ...

  8. 提取一个int类型数最右侧的1

    提取一个int类型数最右侧的1 算法描述 把一个int类型的数,提取出最右侧的1来,例如: 6 对应的二进制位 0000 0110,那么取出来的应该是0000 0010 算法思路 对原数0000 01 ...

  9. libco hook原理简析

    我们先看一下libco协程库的特性描述 libco的特性 无需侵入业务逻辑,把多进程.多线程服务改造成协程服务,并发能力得到百倍提升; 支持CGI框架,轻松构建web服务(New); 支持gethos ...

  10. 通过 JFR 与日志深入探索 JVM - TLAB 原理详解

    全系列目录:通过 JFR 与日志深入探索 JVM - 总览篇 什么是 TLAB? TLAB(Thread Local Allocation Buffer)线程本地分配缓存区,这是一个线程专用的内存分配 ...