1274 - C语言11.10
已有a、b两个链表,每个链表中的节点包括学号、成绩,且a、b两个链表中的节点均按照学号升序排列。要求把两个链表合并,按照学号升序排列并输出。
Input
第一行有两个用空格隔开的整数n和m,分别表示a和b两个链表中的节点个数。保证n和m均不超过100。
之后的n行每行有两个用空格隔开的整数,分别表示一个学生的学号和成绩。
最后的m行每行有两个用空格隔开的整数,分别表示一个学生的学号和成绩。
输入保证所有的节点中学号各不相同。
Output
合并之后升序排列的链表,每行两个用空格隔开的整数,分别表示一个学生的学号和成绩。
Examples
Input
3 5 101 90 104 80 106 85 103 95 105 88 107 87 108 90 109 95
Output
101 90 103 95 104 80 105 88 106 85 107 87 108 90 109 95
Solution C
#include<stdio.h> int main() { int asd,dsa,a[111],b[111],i,j,t,n; scanf("%d%d",&asd,&dsa); n=asd+dsa; for(i=0;i<n;i++) { scanf("%d%d",&a[i],&b[i]); } for(i=0;i<n;i++) { for(j=i;j<n;j++) { if(a[j]<a[i]) { t=a[j]; a[j]=a[i]; a[i]=t; t=b[j]; b[j]=b[i]; b[i]=t; } } } for(i=0;i<n;i++) { printf("%d %d\n",a[i],b[i]); } return 0; }
Solution C++
#include <stdio.h> #include <stdlib.h> struct node { int num, score; struct node * next; }; int main() { struct node *heada, *taila, *headb, *tailb, *head, *tail, *p; heada = taila = headb = tailb = NULL; int n, m, i; scanf("%d %d", &n, &m); /* 读入a链表中的n个学生信息 */ for (i = 0;i < n;i++) { p = (struct node *)malloc(sizeof(struct node)); scanf("%d %d", &p->num, &p->score); if (heada == NULL) { heada = taila = p; } else { taila->next = p; taila = p; } } taila->next = NULL; /* 读入b链表中的m个学生信息 */ for (i = 0;i < m;i++) { p = (struct node *)malloc(sizeof(struct node)); scanf("%d %d", &p->num, &p->score); if (headb == NULL) { headb = tailb = p; } else { tailb->next = p; tailb = p; } } tailb->next = NULL; /* 合并两个链表 */ head = tail = NULL; while (heada != NULL && headb != NULL) { /* 令p指向当前a和b两个链表头中较小的一个 */ if (heada->num < headb->num) { p = heada; heada = heada->next; } else { p = headb; headb = headb->next; } /* 将p指向的节点放到合并后的链表尾部 */ if (head == NULL) { head = tail = p; } else { tail->next = p; tail = p; } } /* 将仍未合并完的链表合并 */ while (heada != NULL) { if (head == NULL) { head = tail = heada; } else { tail->next = heada; tail = heada; } heada = heada->next; } while (headb != NULL) { if (head == NULL) { head = tail = headb; } else { tail->next = headb; tail = headb; } headb = headb->next; } if (tail != NULL) tail->next = NULL; /* 将合并后的链表进行输出 */ p = head; while (p != NULL) { printf("%d %d\n", p->num, p->score); p = p->next; } return 0; }