数据结构实验之链表四:有序链表的归并
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个大的有序单链表,并依次输出合并后的单链表数据。
Input
第一行输入M与N的值; 第二行依次输入M个有序的整数; 第三行依次输入N个有序的整数。
Output
输出合并后的单链表所包含的M+N个有序的整数。
Sample Input
6 5 1 23 26 45 66 99 14 21 28 50 100
Sample Output
1 14 21 23 26 28 45 50 66 99 100
Hint
不得使用数组!
Source
#include"stdio.h"
#include"stdlib.h"
typedef struct node{
int data;
struct node *next;
}*Node;
void creatNode(Node &x,int arry[],int n){
Node temp,r;
x=(Node)malloc(sizeof(struct node));
r=x;
for(int i=0;i<n;i++){
temp=(Node)malloc(sizeof(struct node));
temp->data=arry[i];
r->next=temp;
r=temp;
}
r->next=NULL;
}
Node Merage(Node x,Node y){ //合并两个有序单链表
if(!x) return y;
else if(!y) return x;
Node p1=x->next,p2=y->next,p3,z;//p1 p2 来存放x y头指针便于遍历链表 p3做z的尾指针便于数据插入
z=(Node)malloc(sizeof(struct node));
z->next=NULL;
p3=z;
while(p1&&p2){
p3->next=p1;
p1=p1->next;
}
else{
p3->next=p2;
p2=p2->next;
}
p3=p3->next;
}
p3->next=p1?p1:p2;
return z;
}
int main(){
int m,n;
Node x,y,z;
scanf("%d%d",&m,&n);
int arry1[m],arry2[n];
for(int i=0;i<m;i++){
scanf("%d",&arry1[i]);
}
for(int i=0;i<n;i++){
scanf("%d",&arry2[i]);
}
creatNode(x,arry1,m);
creatNode(y,arry2,n);
z=Merage(x,y);
z=z->next;
while(z){
printf("%d ",z->data);
z=z->next;
}
return 0;
}