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