博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode]Merge k Sorted Lists
阅读量:4150 次
发布时间:2019-05-25

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

struct ListNode {	int val;	ListNode *next;	ListNode(int x) : val(x), next(NULL) {}};class Solution {//O(nlogk)//using priority_queue to choose current minimum node//node: keep priority_queue free of NULL pointerpublic:	struct PQNode	{		int index;		ListNode* ptr;		PQNode(int _index = 0, ListNode* _ptr = NULL):index(_index),ptr(_ptr){}	};	struct Comp	{		bool operator()(const PQNode& lhs, const PQNode& rhs) const		{			return lhs.ptr->val > rhs.ptr->val;		}	};	ListNode *mergeKLists(vector
&lists) { // Start typing your C/C++ solution below // DO NOT write int main() function priority_queue
, Comp> pq; ListNode* head = NULL; ListNode* cur = NULL; do { for(int i = 0; i < lists.size(); ++i) { if(lists[i] != NULL) { pq.push(PQNode(i, lists[i])); lists[i] = lists[i]->next; } } if(pq.empty()) break; if(head == NULL) head = pq.top().ptr; else cur->next = pq.top().ptr; cur = pq.top().ptr; int curIdx = pq.top().index; pq.pop(); if(lists[curIdx] != NULL) { pq.push(PQNode(curIdx, lists[curIdx])); lists[curIdx] = lists[curIdx]->next; } }while(true); if(cur != NULL) cur->next = NULL; return head; }};

second time

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    struct Node    {        ListNode* pNode;        int listIdx;        Node(ListNode* _pNode = NULL, int _listIdx = 0):pNode(_pNode), listIdx(_listIdx){};        bool operator < (const Node& orh) const {return pNode->val > orh.pNode->val;};    };    ListNode *mergeKLists(vector
&lists) { // Start typing your C/C++ solution below // DO NOT write int main() function priority_queue
pq; ListNode dummy(-1); ListNode* prev = &dummy; for(int i = 0; i < lists.size(); ++i) if(lists[i] != NULL) pq.push(Node(lists[i], i)), lists[i] = lists[i]->next; while(!pq.empty()) { prev->next = pq.top().pNode;//top() return the first element in pq prev = prev->next; int listIdx = pq.top().listIdx; pq.pop(); if(lists[listIdx] != NULL) { pq.push(Node(lists[listIdx], listIdx)); lists[listIdx] = lists[listIdx]->next; } } prev->next = NULL; return dummy.next; }};

转载地址:http://qlxti.baihongyu.com/

你可能感兴趣的文章
实验5-5 循环的合并
查看>>
实验5-6 do-while循环结构
查看>>
实验5-7 程序调试入门
查看>>
实验5-8 综合练习
查看>>
第2章实验补充C语言中如何计算补码
查看>>
深入入门正则表达式(java) - 命名捕获
查看>>
使用bash解析xml
查看>>
android系统提供的常用命令行工具
查看>>
【Python基础1】变量和字符串定义
查看>>
【Python基础2】python字符串方法及格式设置
查看>>
【Python】random生成随机数
查看>>
【Python基础3】数字类型与常用运算
查看>>
Jenkins迁移jobs
查看>>
【Python基础4】for循环、while循环与if分支
查看>>
【Python基础5】列表和元组
查看>>
【Python基础6】格式化字符串
查看>>
【Python基础7】字典
查看>>
【Python基础8】函数参数
查看>>
【Python基础9】浅谈深浅拷贝及变量赋值
查看>>
Jenkins定制一个具有筛选功能的列表视图
查看>>