LeetCode 023 Merge k Sorted Lists

题目要求:Merge k Sorted Lists

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

分析:

参考网址:http://blog.csdn.net/a83610312/article/details/8554241

思路是:首先将k个链表的第一个节点集合,建堆,然后取出堆顶的节点,链接到结果链表上,然后将该节点的下一个节点入堆,直到所有链表都已经完成;

下面的Node结构体好像根本无必要,刚开始没注意是链表(而链表可以很方便的获取下一个节点,如果是数组的话还得记录它来自哪个数组);

有两点需要注意:

1.当一条链表结束的时候,添加值为INF的新Node加入堆,可以方便地避免NULL的判断;

2.make_heap()默认是大顶堆,所以要显示指定使用greater<node>(),来获取小顶堆;

代码如下:

#define INF 1000000

struct node{

    int val;
    ListNode* from;

    node(ListNode* n){
        if(n == NULL) val = INF;
        else val = n->val;
        from = n;
    }

    bool operator<(const node& other)const{
        return val<other.val;
    }

    bool operator>(const node& other)const{
        return val>other.val;
    }
};

class Solution {
public:
    ListNode *mergeKLists(vector<ListNode *> &lists) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function

        if (lists.empty()) return NULL;
        int n = lists.size();
        vector<node> heap;
        heap.reserve(n);

        for(int i = 0; i < n; i++)
            heap.push_back(node(lists[i]));

        make_heap(heap.begin(), heap.end(),greater<node>());
        ListNode* head= new ListNode(0);
        ListNode* pL = head;
        pop_heap(heap.begin(), heap.end(),greater<node>());
        node small = heap.back();
        heap.pop_back();

        while(small.val!=INF){

            ListNode* next=small.from->next;
            pL->next=small.from;
            small.from->next=NULL;
            pL=pL->next;

            heap.push_back(node(next));
            push_heap(heap.begin(), heap.end(),greater<node>());
            pop_heap(heap.begin(), heap.end(),greater<node>());
            small=heap.back();
            heap.pop_back();
        }

        ListNode* ret=head->next;
        delete head;
        return ret;    

    }
};
时间: 2024-10-27 13:20:32

LeetCode 023 Merge k Sorted Lists的相关文章

[LeetCode] 023. Merge k Sorted Lists (Hard) (C++/Python)

索引:[LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 023. Merge k Sorted Lists (Hard) 链接: 题目:https://oj.leetcode.com/problems/merge-k-sorted-lists/ 代码(github):https://github.com/illuz/leetcode 题意: 和 021. Merge T

Java for LeetCode 023 Merge k Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 解题思路一: 之前我们有mergeTwoLists(ListNode l1, ListNode l2)方法,直接调用的话,需要k-1次调用,每次调用都需要产生一个ListNode[],空间开销很大.如果采用分治的思想,对相邻的两个ListNode进行mergeTwoLists,每次将规模减少一半,直到

[LeetCode 题解]: Merge k Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 题意:对k个有序的链表进行归并排序.并分析其复杂度. /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(N

[LeetCode][JavaScript]Merge k Sorted Lists

https://leetcode.com/submissions/detail/28015840/ Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 直接使用了“Merge Two Sorted Lists”里写的方法. http://www.cnblogs.com/Liok3187/p/4514347.ht

[LeetCode] 23. Merge k Sorted Lists 合并k个有序链表

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 与21. Merge Two Sorted Lists的拓展,这道题要合并k个有序链表,还是可以两两合并. 类似题目: [LeetCode] 21. Merge Two Sorted Lists 合并有序链表 原文地址:https://www.cnblogs.com/lightwindy/p/8512

【leetcode】Merge k Sorted Lists

Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 采用优先队列priority_queue 把ListNode放入优先队列中,弹出最小指后,如果该ListNode有下一个元素,则把下一个元素放入到队列中 1 /** 2 * Definition for singly-linked list. 3 * stru

[LeetCode]23. Merge k Sorted Lists

23. Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 给定k个排序了的链表,合并k个链表成一个排序链表. 本程序思路: 1)首先得到K个链表的长度和存在len中 2)从K个链表中找到值最小的那个节点,把该节点添加到合并链表中 3)重复len次即可把所有节点添加到合并链表中. 注意事项: 1)K个链表中有的

leetCode 23. Merge k Sorted Lists (合并k个排序链表) 解题思路和方法

Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 思路:此题是由合并两个排序链表演化而来,刚开始,想法比较简单,像求最大公共前缀一样,逐一求解:但是最后超时,所以马上意识到出题方是为了使用归并和分治的方法,故重新写了代码. 代码一(超时未过): /** * Definition for singly-link

leetcode 之 Merge k Sorted Lists

Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 思路:把这k个链表放入multiset中,每次从multiset中取出头结点最小的链表,把头结点插入到结果链表中,然后把剩下的非空子链表插入到multiset中 /** * Definition for singly-linked list. * struct