7-53 两个有序序列的中位数 (25 point(s))

7-53 两个有序序列的中位数 (25 point(s))

已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。

输入样例1:
5
1 3 5 7 9
2 3 4 5 6
输出样例1:
4

输入样例2:
6
-100 -10 1 1 1 1
-50 0 2 3 4 5
输出样例2:
1

因为最近在学链表所以先传用链表做的部分,其实这题直接排序然后输出就完事了(代码在链表方法的后面)。

链表方法:

#include <stdio.h>
#include <stdlib.h>

typedef struct _list{
	int data;
	struct _list *next;
}List;

List * Create(int n);
List * Find(List *s1, List *s2);
void Print(List *s3, int num);

int main() {
	List *s1, *s2, *s3;
	int num, i = 0;
	scanf("%d", &num);
	s1 = Create(num);
	s2 = Create(num);
	s3 = Find(s1, s2);
	if (s3->next) {
		Print(s3, num);
	}
	else {
		printf("NULL\n");
	}
	return 0;
}

List * Create(int n) {
	List *head = (List *)malloc(sizeof(List));
	head->next = NULL;
	List *tail = head;
	int num;
	while (n-- && scanf("%d", &num) == 1) {
		List *p = (List *)malloc(sizeof(List));
		p->data = num;
		tail->next = p;
		tail = p;
	}
	tail->next = NULL;
	return head;
}

List * Find(List *s1, List *s2) {
	List *head = (List *)malloc(sizeof(List));
	head->next = NULL;
	List *tail = head;
	List *p, *q;
	p = s1->next, q = s2->next;
	while (p && q) {
		if (p->data >= q->data) {
			tail->next = q;
			tail = q;
			q = q->next;
		}
		else if (p->data < q->data) {
			tail->next = p;
			tail = p;
			p = p->next;
		}
	}
	tail->next = NULL;
	return head;
}

void Print(List *s3, int num) {
	int cnt = 0;
	while (cnt++ < num - 1) {
		s3 = s3->next;
	}
	printf("%d", s3->next->data);
}

正常方法:

#include <stdio.h>

#define MAX 100000

int main() {
	int n;
	scanf("%d", &n);
	int a[MAX], b[MAX], c[MAX + MAX];
	int i, j, k;
	for (i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}
	for (i = 0; i < n; i++) {
		scanf("%d", &b[i]);
	}
	j = k = 0;
	for (i = 0; i < n * 2; i++) {
		if (a[j] >= b[k]) {
			c[i] = b[k];
			k++;
		}
		else {
			c[i] = a[j];
			j++;
		}
	}
	printf("%d\n", c[n - 1]);
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值