合并K个排序链表

Posted tianzeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合并K个排序链表相关的知识,希望对你有一定的参考价值。

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:
[
  1->4->5,
  1->3->4,
  2->6
]
输出: 1->1->2->3->4->4->5->6

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if(lists.empty())
            return nullptr;
        
        for(int i=1;i<lists.size();++i)
            mergeLists(lists[0],lists[i]);
        
        return lists[0];
    }
private:
    ListNode* mergeLists(ListNode* &l1,ListNode *l2)
    {
        if(!l1&&!l2)
            return nullptr;
        else if(!l1||!l2)
            return l1?l1:l1=l2;
       
        ListNode* head=new ListNode(-1);
        ListNode* H=head;
        while(l1&&l2)
        {
            if(l1->val<=l2->val)
            {
                H->next=l1;
                H=H->next;
                l1=l1->next;
            }
            else
            {
                H->next=l2;
                H=H->next;
                l2=l2->next;
            }
        }
        H->next=l1?l1:l2;
        l1=head->next;
        head->next=nullptr;
        delete head;
        return l1;
    }
};

 堆排序

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if(lists.empty())
            return nullptr;
        
        ListNode head(-1);
        ListNode *H=&head;
        make_heap(lists.begin(),lists.end(),cmpNode);
        while(!lists.empty()&&lists.front())
        {
            pop_heap(lists.begin(),lists.end(),cmpNode);
            H->next=lists.back();
            H=H->next;
            lists.back()=lists.back()->next;
            if(!lists.back())
                lists.pop_back();
            else
                make_heap(lists.begin(),lists.end(),cmpNode);
        }
        return head.next;
    }
    static bool cmpNode(ListNode *l1,ListNode *l2)
    {
        if(!l1||!l2)
            return !l1?true:false;
        
        return l1->val>=l2->val;
    }
};

 

以上是关于合并K个排序链表的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 23合并K个排序链表

[leetcode] 23. 合并K个排序链表

23. 合并K个排序链表-LeetCode

Leetcode练习(Python):链表类:第23题:合并K个排序链表:合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

23. 合并K个排序链表

23. 合并K个排序链表