LeetCode算法题——23. Merge k Sorted Lists

题目:

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Subscribe to see which companies asked this question.

算法思想:
     针对K个排序的链表进行两两合并,合并成新的有序的链表,将合成的新的链表与剩下的K-2个中拿出一个进行合并,依次进行,直到将所有链表合并,在进行两个链表合并时,可以采用将其中一个链表插入的到另一个链表中,也可以生成一个新的链表,将两个链表依次插入到新的链表,在用一个链表插入到另一个链表中时需要考虑在头结点之前插入的问题,因此不能采用传址的形式,而是需要采用传值的形式,因为新合并的链表的首地址有可能不是其中任何一个链表的地址。
     另外,还需要考虑取得的链表为空的情况。

C++实现:

#include <iostream>
#include <vector>
#include "stdlib.h"
using namespace std;


// * 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;
    	}else{
    		int j=0;
    		ListNode* res;
    		while(j<lists.size()&&lists[j]==NULL){
    			j++;
    		}
    		if(j==lists.size()){
    			return NULL;
    		}else{
    			res=lists[j];
		        for(int i=j+1;i<lists.size();i++){
		        	res=mergeTwoLists(res,lists[i]);
		        }
				return res;
    		}   		
    	}               
    }
    ListNode* mergeTwoLists(ListNode* res,ListNode* listElemt){
    	ListNode *resTemp,*q;
    	resTemp=res;
    	while(listElemt!=NULL){
    		resTemp=res;
    		int v=listElemt->val;
			q=(ListNode *)malloc(sizeof(ListNode));
			q->val=v; 
    		if(v<res->val){ 				   			
				q->next=resTemp;
				res=q;								
    		}else{
    			while(resTemp->next!=NULL&&resTemp->next->val<v){
    				resTemp=resTemp->next;    			
    			} 
	    		q->next=resTemp->next;
	    		resTemp->next=q;
    		}    				
    		listElemt=listElemt->next;
    	}
    	return res;
    }
};

int main(){
	ListNode *l1h,*p1,*p2,*l2h,*q1,*q2,*res;
    p1=NULL;
    l1h=NULL;
    q1=NULL;
    l2h=NULL;
    int n,t,m,s;
    cout<<"please input the first List element number:";
    cin>>n;
    for(int i=0;i<n;i++){
        p2=(ListNode *)malloc(sizeof(ListNode));
        cin>>t;
        p2->val=t;
        p2->next=NULL;
        if(l1h==NULL){
            l1h=p1=p2;
        }else{
            p1->next=p2;
            p1=p1->next;
        }               
    }

    cout<<"please input the second List element number:";
    cin>>m;
    for(int i=0;i<m;i++){
        q2=(ListNode *)malloc(sizeof(ListNode));
        cin>>s;
        q2->val=s;
        q2->next=NULL;
        if(l2h==NULL){
            l2h=q1=q2;
        }else{
            q1->next=q2;
            q1=q1->next;
        }               
    }
    vector<ListNode*> lists;
    lists.push_back(l1h);
    lists.push_back(l2h);
	Solution sol;
    res=sol.mergeKLists(lists);
    while(res!=NULL){
        cout<<res->val<<" ";
        res=res->next;
    }
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值