已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0, A1…AN-1的中位数指A(N-1)/2的值,即第[(N+1)/2]个数(A0为第1个数)。
输入格式说明:
输入分3行。第1行给出序列的公共长度N(0<N<=100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。
输出格式说明:
在一行中输出两个输入序列的并集序列的中位数。
解题思路:用数组存储两个有序序列,每次取出一个数比较,小的那个序列往后移,当取到第N个数输出即可。
typedef struct node{
int data[MAX];
int last;
}List;
List *create(int N)
{
List *L;
int i,x;
L=malloc(sizeof(List));
L->last=-1;
for(i=0;i<N;i++)
{
scanf("%d",&x);
L->data[++L->last]=x;
}
return L;
}
main()
{
List *L1,*L2;
int N,i,j,num;
scanf("%d",&N);
L1=create(N);
L2=create(N);
num=i=j=0;
while(num<N-1)
{
if(L1->data[i]<=L2->data[j])
{
i++;
num++;
}
else
{
j++;
num++;
}
}
if(L1->data[i]<=L2->data[j])
printf("%d\n",L1->data[i]);
else
printf("%d\n",L2->data[j]);
}