题目:
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;
}