给你两个有序数列,他们的长度分别为 nn 和 mm,现在需要你完成以下操作:
-
读入这两个数列并用两个链表把他们按从小到大的顺序分别储存下来,生成两个链表的头指针
Node *h1, *h2
; -
编写一个链表合并函数,将两个有序链表合并成一个有序链表。传入的参数为两个待合并链表的头指针,返回值为生成链表的头指针
Node *Merge(Node *h1, *h2)
; -
最后将合并完的链表中的值按从小到大的顺序输出。
输入格式
输入第一行两个整数 n,mn,m。
接下来两行分别是两个长度为 nn 和 mm 的有序数列。
输出格式
输出一行表示答案。
样例输入
4 3
1 2 3 5
2 4 6
样例输出
1 2 2 3 4 5 6
数据规模
对于所有数据,保证 1≤n,m≤1000001≤n,m≤100000。
#include<bits/stdc++.h>
using namespace std;
struct Node{
int v;
Node *next;
}*h1,*h2,*t1,*t2,a[111111],b[111111];
int n,m;
Node *Merge(Node *h1,Node *h2){
Node *h3=NULL,*t3=NULL;
while(h1&&h2){
if(h1->v<h2->v){
if(h3==NULL)
h3=t3=h1;
else{
t3->next=h1;
t3=h1;
}
//printf("%d %d\n",h1,h2);
Node *x=h1;
h1=h1->next;
x->next=NULL;
}else{
if(h3==NULL)
h3=t3=h2;
else{
t3->next=h2;
t3=h2;
}
//printf("%d %d\n",h1,h2);
Node *x=h2;
h2=h2->next;
x->next=NULL;
}
}
while(h1){
t3->next=h1;
t3=h1;
Node *x=h1;
h1=h1->next;
x->next=NULL;
}while(h2){
t3->next=h2;
t3=h2;
Node *x=h2;
h2=h2->next;
x->next=NULL;
}
return h3;
}
int main(){
scanf("%d%d",&n,&m);
h1=t1=NULL;
for(int i=1;i<=n;i++){
scanf("%d",&a[i].v);
if(h1==NULL)
h1=t1=&a[i];
else{
t1->next=&a[i];
t1=&a[i];
}
}
h2=t2=NULL;
for(int i=1;i<=m;i++){
scanf("%d",&b[i].v);
if(h2==NULL)
h2=t2=&b[i];
else{
t2->next=&b[i];
t2=&b[i];
}
}
Node *h3=Merge(h1,h2);
for(Node *p=h3;p;p=p->next)
printf("%d ",p->v);
return 0;
}