23. 合并K个排序链表--有序链表的合并问题

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

示例:

输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
题目分析:
首先写一个将两个有序链表合并为一个链表的函数,使用此函数将lists中的所有链表依次合并到第一个链表当中。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* merge(ListNode*l1,ListNode*l2){         //将两个链表合并的函数
        if(l1==NULL&&l2!=NULL){                       //如果两个链表有一个为空,那么返回另外一个。如果都为空,返回NULL。
            return l2;
        }
        else if(l1!=NULL&&l2==NULL){
            return l1;
        }
        else if(l1==NULL&&l2==NULL){
            return NULL;
        }
        ListNode*ans,*p;
        if(l1->val<=l2->val){             //处理首节点
            ans=l1;
            l1=l1->next;
        }
        else{
            ans=l2;
            l2=l2->next;
        }
        p=ans;                        
        while(l1!=NULL&&l2!=NULL){       //每次从两个链表中取出一个结点放到结果链表当中
            if(l1->val<=l2->val){
                p->next=l1;
                l1=l1->next;
                p=p->next;
            }
            else{
                p->next=l2;
                l2=l2->next;
                p=p->next;
            }
        }
        while(l1!=NULL){                    //两个while只执行一个,将长的那个链表的剩余结点放到结果链表中
            p->next=l1;      
            l1=l1->next;
            p=p->next; 
        }
        while(l2!=NULL){
            p->next=l2;
            l2=l2->next;
            p=p->next;  
        }
        p->next=NULL;                       //将链表的结尾置为NULL;
        return ans;
    }
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if(lists.size()==0){                //如果lists为空,那么返回NULL;
            return NULL;
        }
        ListNode*ans=lists[0];
        for(int i=1;i<lists.size();i++){
            ans=merge(ans,lists[i]);           //处理所有的链表
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/LITTENg/article/details/80040142