zoukankan      html  css  js  c++  java
  • [LeetCode] #23 Merge k Sorted Lists

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

    本题是多链表融合,可以选择利用归并算法思想,两两链表融合后再归并,也可以一起融合。本文是一起融合的想法,利用最小堆,每次选取最小的元素。时间:424ms

    代码如下:

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        struct CompareListElement {
            bool operator ()(const ListNode* a, const ListNode* b) const{
                return (a->val > b->val);
            }
        };
        ListNode *mergeKLists(vector<ListNode *> &lists) {
            vector<ListNode*> vecK;
            ListNode* dummyHead = new ListNode(0);
            ListNode* tail = dummyHead;
            for (vector<ListNode *>::size_type i = 0; i < lists.size(); ++i) {
                if (lists[i] != NULL) {
                    vecK.push_back(lists[i]);
                }
            }
            std::make_heap(vecK.begin(), vecK.end(), CompareListElement());
            while (!vecK.empty()) {
                tail->next = vecK.front();
                tail = tail->next;
                std::pop_heap(vecK.begin(), vecK.end(), CompareListElement()); 
                vecK.pop_back();
                if (tail->next != NULL) {
                    vecK.push_back(tail->next);
                    std::push_heap(vecK.begin(), vecK.end(), CompareListElement()); 
                }
            }
            return dummyHead->next;
        }
    };
    “If you give someone a program, you will frustrate them for a day; if you teach them how to program, you will frustrate them for a lifetime.”
  • 相关阅读:
    个人案例分析
    软工结对作业
    交点问题
    C语言复习
    【软件工程】提问回顾与个人总结
    【技术博客】Arxiv的新Paper获取和机翻
    【技术博客】动态面包屑导航
    对对碰 -- 软工结对编程博客
    交点计数 -- 软工个人项目作业
    面向对象的程序设计-模块四课程总结
  • 原文地址:https://www.cnblogs.com/Scorpio989/p/4545904.html
Copyright © 2011-2022 走看看