LeetCode 23. 合并K个排序链表(C++)

看着篇博客之前的同学有兴趣最好看下我的前篇原 LeetCode 21. 合并两个有序链表(C++)因为我们会用到。

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

示例:

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

我们前面已经看过了合并两个有序链表,这个时候我们就可以进行类型的转换了。用的思路就是把K哥链表两两合并,有点相似与归并排序的和并部分,我的代码采用的是第一个链表与最后一个链表合并,第二个链表和倒数第二个链表合并,一轮下来合并K个链表就变成了合并(K+1)/2个链表,知道合并到一个链表,就完成了这道题。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode *newHead=new ListNode(0);
        ListNode *head=newHead;

           while(l1!=NULL&&l2!=NULL){
                if(l1->val>l2->val){
                    newHead->next=l2;
                    l2=l2->next;
                    newHead=newHead->next;
                }else{
                    newHead->next=l1;
                    l1=l1->next;
                    newHead=newHead->next;
                }
                
            }
            if(l1!=NULL&&l2==NULL){
                newHead->next=l1;
                
            }else if(l1==NULL&&l2!=NULL){
                newHead->next=l2;
            }
        
        return head->next;
        }

    ListNode* mergeKLists(vector<ListNode*>& lists) {
        
        if(lists.size()==0){
            return NULL;
        }
        int k=lists.size();
        while (k>1){ //一直和并到只有一个链表
            for(int i=0;i<k/2;i++){  //把第一个链表与最后一个链表和并
                 lists[i]=mergeTwoLists(lists[i], lists[i+(k+1)/2]);
            }
            k=(k+1)/2;
        }
            
        return lists[0];
    }
};

猜你喜欢

转载自blog.csdn.net/a15929748502/article/details/89248586