已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0,A1,⋯,AN−1的中位数指A(N−1)/2的值,即第⌊(N+1)/2⌋个数(A0为第1个数)。
输入格式:
输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的并集序列的中位数。
代码:/*
@两个有序序列的中位数
*/
#include<cstdio>
#include<cstdlib>
#include<iostream>
#define OK 1
#define OVERFLOW -2
using namespace std;
typedef int Status;
typedef int ElemType;//假设线性表中的元素均为整型
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void ListPrint(LinkList &L) //打印链表
{
LNode *p = L->next; //p指向第一个元素结点
if(p==NULL)
printf("NULL");
while(p!=NULL)
{
if(p->next!=NULL)
printf("%d ",p->data);
else
printf("%d",p->data);
p = p->next;
}
}
Status CreateList(LinkList &L,int n) //构建链表
{
L = (LinkList)malloc(sizeof(LNode));
LNode *p = L;
p->next = NULL;
while(n--)
{
int d;
cin>>d;
LNode *tp = (LNode *)malloc(sizeof(LNode));
if(tp==NULL)
return OVERFLOW;
tp->data = d;
p->next = tp;
tp->next = NULL;
p = tp;
}
return OK;
}
void MergeList(LinkList &A,LinkList &B,LinkList &C) //合并链表
{
LNode *pa,*pb,*pc;
pa = A->next;
pb = B->next;
pc = C;
while(pa&&pb)
{
if((pa->data)<=(pb->data))
{
pc->next = pa;
pa = pa->next;
pc = pc->next;
}
else
{
pc->next = pb;
pb = pb->next;
pc = pc->next;
}
}
while(pa){
pc->next = pa;
pa = pa->next;
pc = pc->next;
}
while(pb){
pc->next = pb;
pb = pb->next;
pc = pc->next;
}
pc->next = NULL;
}
int LinkLength(LinkList &L){ //链表长度
LinkList k = L->next;
int count = 0;
while(k){
count++;
k = k->next;
}
return count;
}
int indexLink(LinkList &L){ //求合并后的链表的中位数
int len = LinkLength(L);
int k = len/2-1; //循环k-1次,打印第k项值
LinkList item = L->next;
while(k--&&item){
item = item->next;
}
return item->data;
}
int main()
{
LinkList A,B,C;
C = (LinkList)malloc(sizeof(LNode));
if(C==NULL)
return OVERFLOW;
C->next = NULL;
int n;
cin>>n;
CreateList(A,n);
CreateList(B,n);
MergeList(A,B,C);
cout<<indexLink(C)<<endl;
return 0;
}
该博客主要介绍了如何处理两个等长非降序序列S1和S2,以找到它们并集的中位数。根据输入的序列长度N(N小于等于100000)及序列中的整数,通过计算确定并集序列的中位数,并按指定格式输出结果。

1525

被折叠的 条评论
为什么被折叠?



