PTA- 两个有序序列的中位数

该博客主要介绍了如何处理两个等长非降序序列S1和S2,以找到它们并集的中位数。根据输入的序列长度N(N小于等于100000)及序列中的整数,通过计算确定并集序列的中位数,并按指定格式输出结果。

已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0,A1,,AN1的中位数指A(N1)/2的值,即第(N+1)/2个数(A0为第1个数)。

输入格式:

输入分三行。第一行给出序列的公共长度N(0<N100000),随后每行输入一个序列的信息,即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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值