游客 Signup | Login
中文 | En

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;
}

Time Limit 1 second
Memory Limit 32 MB
Discuss Stats
上一题 下一题