• Leetcode 023 合并K个升序链表 堆 链表


    地址 https://leetcode-cn.com/problems/merge-k-sorted-lists/

    给你一个链表数组,每个链表都已经按升序排列。
    请你将所有链表合并到一个升序链表中,返回合并后的链表。
    
    示例 1:
    输入:lists = [[1,4,5],[1,3,4],[2,6]]
    输出:[1,1,2,3,4,4,5,6]
    解释:链表数组如下:
    [
      1->4->5,
      1->3->4,
      2->6
    ]
    将它们合并到一个有序链表中得到。
    1->1->2->3->4->4->5->6
    
    示例 2:
    输入:lists = []
    输出:[]
    
    示例 3:
    输入:lists = [[]]
    输出:[]
     
    
    提示:
    k == lists.length
    0 <= k <= 10^4
    0 <= lists[i].length <= 500
    -10^4 <= lists[i][j] <= 10^4
    lists[i] 按 升序 排列
    lists[i].length 的总和不超过 10^4
    

    解答
    最原始的想法就是
    1 每次遍历所有链表 找出链表头数据最小的那个链表a
    2 取出链表a的第一个最小树存储,然后从链表a删除该数据。再次进入遍历所有链表 找出最小数据链表的过程1
    循环直到所有链表为空 . 假设链表为k项 时间复杂度为O(km)

    优化办法
    每次遍历都是为了寻找链表头数值最小的链表
    那么我们使用最小堆来存储链表头,每次链表头数值最小的链表在堆顶端,可以节省每次遍历的时间。 复杂度为O(m*logK)

    class Solution {
    public:
    	struct cmp {
    		bool operator ()(ListNode *a, ListNode* b) {
    			return a->val > b->val;//最小值优先 
    		}
    	};
    	priority_queue<ListNode*, vector<ListNode*>, cmp > Q;
    	
    	ListNode* mergeKLists(vector<ListNode*>& lists) {
    		for (auto& e : lists) {
                if(e!=NULL)
    			    Q.push(e);
    		}
    		ListNode* ans = new ListNode(-999999);
    		ListNode* p = ans;
    		while (!Q.empty()) {
    			ListNode* curr = Q.top();
    			Q.pop();
    			p->next = new ListNode(curr->val);
    			curr = curr->next;
    			if (curr != NULL) {
    				Q.push(curr);
    			}
    			p = p->next;
    		}
    
    		return ans->next;
    	}
    };
    

    我的视频题解空间

    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    HTML DOM-->内部样式表与外部样式表的读写
    HTML DOM-->行间样式表的读写
    HTML DOM-->获取文本节点
    HTML DOM-->获取属性节点
    HTML DOM-->获取标签(元素)节点
    HTML DOM-->简介
    JS 浏览器BOM-->setTimeout() 方法
    JS 浏览器BOM-->clearInterval() 方法
    JS 浏览器BOM-->setInterval() 方法
    JS 浏览器BOM-->onresize方法
  • 原文地址:https://www.cnblogs.com/itdef/p/15473091.html
Copyright © 2020-2023  润新知