Leetcode 23. 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(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        
        if(lists.size() <= 0) return NULL;
        //归并排序,
        int allList = lists.size() - 1;
        
        //先归并前配对个
        for(int i = 0; i < allList; ++i)
        {
              ListNode* tyu = merge(lists[2*i],lists[2*i+1]);
              
              
              lists.push_back(tyu);
        }
 
       vector<ListNode*>::iterator ite = lists.end();
       return *--ite;
    }
    
    //对两个链表进行归并
     ListNode* merge(ListNode* list1, ListNode* list2)
     {
       if(list1 == NULL && list2 == NULL) return NULL;
       
       if(list1 == NULL)
       {
           return list2;
       }
       
       if(list2 == NULL)
       {
           return list1;
       }
        
       ListNode* pHead = NULL;
       if(list1->val <= list2->val)
       {
           pHead = list1;
           pHead->next = merge(list1->next, list2);
       }
       else
       {
           pHead = list2;
           pHead->next = merge(list1,list2->next);
       }
       
       return pHead;
     }
};
下边通过最小堆的求解方法看的别人写的:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
struct cmp
{
    bool operator()(pair<ListNode*, int> a, pair<ListNode*, int> b) {
        return a.first -> val > b.first -> val;
    }
};
class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        // 构建小根堆,由于在计算中对于一个节点,需要知道其原本所属的链表编号,所以要用pair来记录
        priority_queue<int, vector<pair<ListNode*, int> >, cmp> heap;
        for (int i = 0; i < lists.size(); i++) {
            if (lists[i] != NULL) {
                heap.push(make_pair(lists[i], i));
                lists[i] = lists[i] -> next;
            }
        }
        // 构建答案链表
        ListNode *head = new ListNode(0);
        ListNode *tail = head;
        // 当堆不为空时说明还没有完成
        while (heap.size() > 0) {
            // 不断从小根堆中选取最小值加入到答案的最后
            tail -> next = heap.top().first;
            tail = tail -> next;
            int index = heap.top().second;
            heap.pop();
            // 并取出其对应链表的下一个元素加入到堆中
            if (lists[index] != NULL) {
                heap.push(make_pair(lists[index], index));
                lists[index] = lists[index] -> next;
            }
        }
        // 返回答案
        return head -> next;
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值