链表合并
题目描述
已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。
输入格式
第一行,a、b两个链表元素的数量N、M,用空格隔开。 接下来N行是a的数据 然后M行是b的数据 每行数据由学号和成绩两部分组成
输出格式
按照学号升序排列的数据
样例输入
2 3
5 100
6 89
3 82
4 95
2 10
样例输出
2 10
3 82
4 95
5 100
6 89
AC代码(C语言)
#include <stdio.h>
typedef struct Student{
int number;
int score;
}Student;
int main()
{
int N,M;
Student a[100],b[100];//两个链表
scanf("%d%d",&N,&M);
for(int i=0;i<N;i++){
scanf("%d%d",&a[i].number,&a[i].score);
}
for(int i=0;i<M;i++){
scanf("%d%d",&b[i].number,&b[i].score);
}
//先对两个链表中的数据按学号顺序进行排序
for(int i=0;i<N;i++){
for(int j=i+1;j<N;j++){
if(a[i].number>a[j].number){
Student temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
for(int i=0;i<M;i++){
for(int j=i+1;j<M;j++){
if(b[i].number>b[j].number){
Student temp;
temp=b[i];
b[i]=b[j];
b[j]=temp;
}
}
}
int i=0,j=0;
while(i<N&&j<M){//依次比较两个链表中的数据,输出学号较小的那项
if(a[i].number<b[j].number){
printf("%d %d\n",a[i].number,a[i].score);
i++;
}else{
printf("%d %d\n",b[j].number,b[j].score);
j++;
}
}//如果其中一个链表已经比较完了,输出另一个链表的全部内容
while(i<N){
printf("%d %d\n",a[i].number,a[i].score);
i++;
}
while(j<M){
printf("%d %d\n",b[j].number,b[j].score);
j++;
}
return 0;
}