题目描述
已有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
提交采用C++方式提交
#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode
{
int data;
int score;
struct Lnode *next;
}LinkNode;
void InitList(LinkNode *&L)
{
L=(LinkNode *)malloc(sizeof(LinkNode));
L->next=NULL;
}
void CreatList(LinkNode *&L,int n)
{
LinkNode *p,*r;
r=L;
int i;
for(i=0;i<n;i++)
{
p=(LinkNode *)malloc(sizeof(LinkNode));
scanf("%d %d",&p->data,&p->score);
r->next=p;
r=p;
}
r->next=NULL;
}
void Print(LinkNode *L)
{
LinkNode *p=L->next;
while(p!=NULL)
{
printf("%d %d\n",p->data,p->score);
p=p->next;
}
}
void order(LinkNode *head1,LinkNode *head2)
{
LinkNode *head=head1,*p;
head2=head2->next;
while(head->next!=NULL)
{
head=head->next;
}
head->next=head2;
head=head1->next;
p=head;
int temp,m,n;
LinkNode *q,*min;
while(p!=NULL)
{
q=p;
temp=q->data;
min=q;
while(q!=NULL)
{
if(q->data < temp)
{
temp=q->data;
min=q;
}
q=q->next;
}
m=p->data;
p->data=min->data;
min->data=m;
n=p->score;
p->score=min->score;
min->score=n;
p=p->next;
}
p=head1->next;
while(p)
{
printf("%d %d\n",p->data,p->score);
p=p->next;
}
}
int main()
{
int n,m;
LinkNode *head1,*head2;
scanf("%d %d",&n,&m);
InitList(head1);
InitList(head2);
CreatList(head1,n);
CreatList(head2,m);
order(head1,head2);
return 0;
}