【leetCode】之 合并k个排序链表

题目:

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

示例:

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

分析:我想的办法就比较平常了,时间复杂度为(O(k * n))

大体就是每两个链表进行一次合并,当然主义的问题就是边界条件,还有几个判断返回的条件

代码:

/**
 * 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) {
        ListNode *L = NULL  , *l ;
        //无链表输入,直接返回L
        if(lists.size() == 0) return L;
        //只输入了一个链表,直接返回即可
        if(lists.size() == 1) return lists[0] ;
        
        for(int i = 0 ; i < lists.size() - 1 ; ){
            //若链表为空,则i++依次向后判断
            while(i < lists.size() - 1 && lists[i] == NULL) i ++ ;
            //当i指向最后一个链表时,判断最后一个是否为空
            //是则证明数组中每个链表都是空的,返回L
            //若不为空,则证明数组中只有最后一个链表非空,直接返回即可
            if(i == lists.size() - 1){
                if(lists[i] == NULL)
                    return L ;
                else
                    return lists[i] ;
            }
            //j相当于另一个指针,与i指向的链表相合并
            int j = i + 1 ;
            while(j < lists.size() && lists[j] == NULL) j ++ ;
            //若j在判断链表是否为空的过程中指向了数组之外
            //证明从i指向的位置之后的链表均为空,返回i指向的链表即可
            if(j == lists.size())
                return lists[i] ;
            
            L = lists[i]->val < lists[j]->val ? lists[i] : lists[j] ;
            lists[i]->val < lists[j]->val ? lists[i] = lists[i]->next : lists[j] = lists[j]->next ;
            l = L ;
            
            while(lists[i] != NULL && lists[j] != NULL){
                if(lists[i]->val <= lists[j]->val){
                    l->next = lists[i] ;
                    l = l->next ;
                    lists[i] = lists[i]->next ;
                }
                else{
                    l->next = lists[j] ;
                    l = l->next ;
                    lists[j] = lists[j]->next ;
                }
            }
            
            if(lists[i]) l->next = lists[i] ;
            if(lists[j]) l->next = lists[j] ;
            lists[j] = L ;
            i = j;
        }
        return L ;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值