博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++-merge k sorted lists heap的灵活应用
阅读量:7069 次
发布时间:2019-06-28

本文共 2190 字,大约阅读时间需要 7 分钟。

题目描述

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

思路有很多

1.先将这些链表转化为一个vector int型的数组,然后排序后,再转化为链表。

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode *mergeKLists(vector
&lists) { ListNode* res=new ListNode(-1); ListNode* res_tmp=res; vector
A; for(int i=0;i
val); lists[i]=lists[i]->next; } } for(int m=0;m
A[n]){ int temp=A[n]; A[n]=A[m]; A[m]=temp; } } ListNode* tmp=new ListNode(A[m]); res_tmp->next=tmp; res_tmp=res_tmp->next; } return res->next; }};
2.利用STL中的heap。heap有很多排序的方法。

首先新建一个vector<ListNode *> 类型的变量,然后先将这些lists放入这个新建的链表容器中。

将该链表容器转化为heap(堆):利用make_heap

STL提供的是max-heap也就是从大到小排列,因此要改到从小到大排列。然后将第一个和最后一个调换,再输出最后一个,放入新的链表即可:

static bool compareLess(ListNode* l1,ListNode* l2)   {       return l1->val > l2->val;   }   ListNode* mergeKLists(vector
&lists) { ListNode fake(0); ListNode *cur = &fake; vector
vec; int listSize = lists.size(); for(int i=0;i
next = vec.front(); // 堆第一个节点first为最小值节点 pop_heap(vec.begin(),vec.end(),compareLess); // 它把first和last-1交换,然后重新生成一个堆 vec.pop_back(); // 容器弹出最后一个节点 cur = cur->next; if(cur->next) // 添加弹出的最小值的节点所在链表节点 last-1位置 { vec.push_back(cur->next); push_heap(vec.begin(),vec.end(),compareLess); // first到last-1是一个有效堆,新加入元素重新生成堆 } } return fake.next; }

注意make_heap进行了重载,加上了最后一个比较参数,也就是重新设定排序规则,本来是从大到小,现在利用compareless函数设定为从小到大。

转载于:https://www.cnblogs.com/sichenzhao/p/9320174.html

你可能感兴趣的文章
java编程cpu选i5还是i7,i5处理器和i7哪个好_i5和i7怎么选择-系统城
查看>>
php字典删除指定元素,完美解决python遍历删除字典里值为空的元素报错问题
查看>>
php strip_tags如何打开,php strip_tags函数怎么用
查看>>
name.php,rewrite_name.php
查看>>
超越虚拟化-融合之道
查看>>
[转]用wget下载整个网站
查看>>
Javascript之继承(其他方式)
查看>>
薏米红豆粥功效及做法介绍
查看>>
IIS7基本框架
查看>>
C++的性能优化实践
查看>>
HTML <fieldset> 标签
查看>>
SharePoint 2013中Office Web Apps的一次排错
查看>>
Ubutu 12.04 LTS 安装iNode 后缺少libjpeg.so.62与libtiff.so.3解决方法--软连接问题
查看>>
简单组合逻辑电路的verilog实现(包括三态门、3-8译码器、8-3优先编码器、8bit奇偶校验器)...
查看>>
新浪微博Python SDK笔记——发微博(一)
查看>>
从零开始学C++之构造函数与析构函数(一):构造函数、析构函数、赋值与初始化、explicit关键字...
查看>>
SQL Server 表,记录 死锁解决办法
查看>>
Spring MVC
查看>>
Linux&shell 之Shell命令进阶
查看>>
浏览器内核Trident/Gecko/WebKit/Presto
查看>>