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

示例:

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

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

 ListNode* mergeKLists(vector<ListNode*>& lists)
{
ListNode* newhead=new ListNode(0);
ListNode* cur=newhead;
int len=lists.size();
if(len==0) return NULL;
ListNode** p=new ListNode*[len];
for(int i=0;i<len;i++)
{
p[i]=lists[i];
}
while(cur)
{
int pos=0;
int min=INT_MAX;
for(int i=0;i<len;i++)
{
if(p[i]&&min>p[i]->val )//找到最小的节点,并记录链表的下标
{
pos=i;
min=p[i]->val;
}
}
if(p[pos])//不为空挂在后面,否则意味着全为空了,退出
{
cur->next=new ListNode(p[pos]->val);
p[pos]=p[pos]->next;
cur=cur->next;
}
else
break;
}
return newhead->next;
}

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

struct cmp {
bool operator() (const ListNode* a, const ListNode* b)
{
return a->val > b->val;
}
}; class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
priority_queue<ListNode*, vector<ListNode*>, cmp> heap;
ListNode *head = new ListNode(0);
ListNode *curr = head; auto iter = lists.begin();
for (; iter != lists.end(); iter++)
{
if (*iter != NULL)
{
heap.push(*iter);
}
} while (!heap.empty())
{
ListNode* minNode = heap.top();
heap.pop();
ListNode* tmp = new ListNode(minNode->val);
curr->next = tmp;
curr = curr->next;
if (minNode->next != NULL)
{
heap.push(minNode->next);
}
} return head->next;
}
};

最新文章

  1. win7默认网关不可用怎么解决
  2. php SPL常用接口
  3. mysql metadata lock锁
  4. 数据挖掘10大算法(1)——PageRank
  5. Cacti &#39;graph_xport.php&#39; SQL注入漏洞
  6. void类型及void指针
  7. sgu 102 Coprimes
  8. eclipse 配置 Tomcat 遇到的问题以及解决办法
  9. C语言数据类型的表示范围
  10. CSS 专业技巧
  11. POJ 2411 状态压缩递,覆盖方案数
  12. shell 脚本实现定时备份mysql数据库
  13. redis恢复(aof)
  14. Git的安装和使用
  15. git学习之时光穿梭机
  16. ENQUIRE the predecessor to the World Wide Web.
  17. Oracle中判断(case when),截取(substr),位置(instr)用法
  18. bzoj千题计划229:bzoj4424: Cf19E Fairy
  19. Wannafly挑战赛21A
  20. Java多线程之可见性与原子性——synchronized VS volatile

热门文章

  1. PKU2186 Popular Cows 受欢迎的牛
  2. Django 模型(数据库)-cmd下的操作
  3. 在vSphere中为不同服务器配置IPMI功能
  4. Xamarin.Forms: 无限滚动的ListView(懒加载方式)
  5. 如何应对C语言内存泄露! 华为开发者社区 2020-09-29
  6. (hive)hive优化(转载)
  7. 轻型目录访问协议 ldap 公司内部网站的登录 单点登录
  8. 服务端渲染 数据驱动 不是渲染后的网页,而是一个由html和Javascript组成的app ssr 隐藏接口服务器
  9. wireshark使用手册
  10. Java多线程--两种实现方式