leetcode 23. Merge k Sorted Lists

题目:

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

合并k个排好序的的链,并且返回一个有序链。


方法一:

想到21题是合并两个排好序的链,那么这个题可以借鉴思想。

每次从数组中取两个链表,将合并结果加入到链表中,反复这个过程,直到数组中只剩一个链表为止,对两个链表进行合并的代码可以复用LeetCode21的代码。

/**
 * 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) 
    {
        //lists的长度
        int length = lists.size();
        if(length==0)
        return NULL;

        while(lists.size()>1)
        {
            ListNode *p,*q;
            
            p=lists.front();
            lists.erase(lists.begin());
            q=lists.front();
            lists.erase(lists.begin());          
            lists.push_back(merge2Lists(p,q));
        }     
        return lists[0];
    }
    
    
    //根据leetcode 21题的,合并两个排好序的链的方法思路合并
    ListNode * merge2Lists(ListNode * p , ListNode * q)
    {
        if(p==NULL)
        return q;
        if(q==NULL)
        return p;
        
        ListNode *t1,*t2,*head,*tail;
        
        t1=p;
        t2=q;
        if(p->val < q->val)
        {
            head=p;
            t1=t1->next;
            tail=p;
        }
        else
        {
            head=q;
            t2=t2->next;
            tail=q;
        }
        
        while(t1!=NULL && t2!=NULL)
        {
            if(t1->val<t2->val)
            {
                tail->next=t1;
                t1=t1->next;
            }
            else
            {
                tail->next=t2;
                t2=t2->next;
            }
            tail=tail->next;
        }
        
        if(t1==NULL)
            tail->next=t2;
        else
            tail->next=t1;
        
        return head;
    }
};                                                                                                                                   // 创建链表
ListNode* CreateList(int A[],int n)
{
    ListNode *head = NULL;
    if(n <= 0){
        return head;
    }
    head = new ListNode(A[0]);
    ListNode *p1 = head;
    for(int i = 1;i < n;i++){
        ListNode *node = new ListNode(A[i]);
        p1->next = node;
        p1 = node;
    }
    return head;
}

int main() 
{
    Solution solution;
    vector<ListNode *> vecs;
    int A[] = {1,2,4,7,9};
    int B[] = {3,5,8,10,11,12};
    int C[] = {6,10,13};
    int D[] = {15,16,17,23};
    ListNode* head1 = CreateList(A,5);
    ListNode* head2 = CreateList(B,6);
    ListNode* head3 = CreateList(C,3);
    ListNode* head4 = CreateList(D,4);

    vecs.push_back(head1);
    vecs.push_back(head2);
    vecs.push_back(head3);
    vecs.push_back(head4);

    ListNode *head = solution.mergeKLists(vecs);
    // 输出
    ListNode *p = head;
    while(p){
        cout<<p->val<<" ";
        p = p->next;
    }
}<span style="white-space:pre">	</span>



方法二:

利用堆排序的思想。

参考他的博客:http://www.cnblogs.com/skysand/p/4300711.html



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值