归并排序 + 合并两个有序链表,简单易理解

合并k个已排序的链表

http://www.nowcoder.com/questionTerminal/65cfde9e5b9b4cf2b6bafa5f3ef33fa6

class Solution {
public:
    ListNode* help(ListNode* a, ListNode* b){
        if(a == nullptr || b == nullptr) return a == nullptr ? b : a;
        ListNode* head, *last, *i, *j;
        if(b->val > a->val){head = last = a; i = a->next; j = b;}
        else {head = last = b; i = a; j = b->next;}
        while(i != nullptr && j != nullptr){
            if(i->val < j->val){last->next = i; i = i->next;}
            else{last->next = j; j = j->next;}
            last = last->next;
        }
        last->next = i == nullptr ? j : i;
        return head;

    }
    ListNode* merge(vector<ListNode*> lists, int l, int r){
        if(l > r) return nullptr;
        if(l == r) return lists[l];
        auto i = merge(lists, l, (l + r) / 2);
        auto j = merge(lists, (l + r) / 2 + 1, r);
        return help(i, j);
    }

    ListNode *mergeKLists(vector<ListNode *> &lists) {
        int size = lists.size();
        if(size == 0) return nullptr;
        if(size == 1) return lists[0];
        return merge(lists, 0, size - 1);
    }
};
全部评论

相关推荐

头像
不愿透露姓名的神秘牛友
05-14 18:44
点赞 评论 收藏
转发
2 收藏 评论
分享
牛客网
牛客企业服务