题目如图所示

算法思想(使用c++语言):

(1)利用带头结点的单链表存储升序序列。

(2)计算中位数K的位置,

(3)由于序列递增有序,通过循环比较两个链表结点的值,将结点值较小的结点所在链表移到下一结点,并递减K,当K为0时即找到中位数

注:当然可以用两个一维数组,计算中位数K的位置,通过改变下标来找到中位数,我这里是想多多练习单链表,408在链表上出编程题蛮多的,同时

带头结点的单链表处理起来方便一些。

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

typedef struct LNode
{
    int data;
    struct LNode* next;
}Node,*Link;

void Init(Link& link)
{
    link = (Link)malloc(sizeof(Node));
    link->next = NULL;
}

///构造两个升序序列,遇到大于等于9999的数便停止
void Input(Link& link)
{
    Node* p = link;
    int x;
    scanf("%d", &x);
    while (x < 9999)
    {
        Node* s = (Node*)malloc(sizeof(Node));
        s->data = x;
        p->next = s;
        p = s;
        scanf("%d", &x);
    }
    p->next = NULL;
}

//计算链表长度
int GetLen(Link link)
{
    Node* p = link;
    int len = 0;
    while (p->next != NULL)
    {
        len++;
        p = p->next;
    }
    return len;
}


//找出序列s1和s2的中位数
void Func(Link s1, Link s2)
{
    int len1 = GetLen(s1);//计算每个链表的长度
    int len2 = GetLen(s2);

    int k = (len1 + len2) / 2;//计算中位数所在位置
    if ((len1 + len2) % 2 == 1)
        k += 1;

    //用t保存最终的中位数
    //每次循环比较两个链表结点的值,t保存其中较小者,
    //并将结点值较小的结点所在链表移到下一结点,最后递减K
    Node* p1 = s1, * p2 = s2; int t;
    while (k > 0 && p1->next != NULL && p2->next != NULL)
    {
        if (p1->next->data > p2->next->data)
        {
            t = p2->next->data;
            p2 = p2->next;
        }
        else
        {
            t = p1->next->data;
            p1 = p1->next;
        }
        k--;
    }
    //尾部处理,下面两个循环最多只会执行一个
    //若一个链表比另一个链表长得多,
    //上面循环的结束是因为较短链表的next为NULL,但k>0
    //这里的处理类似于归并算法中的尾部处理
    while (k > 0 && p1->next != NULL)
    {
        t = p1->next->data;
        p1 = p1->next;
        k--;
    }
    while (k > 0 && p2->next != NULL)
    {
        t = p2->next->data;
        p2 = p2->next;
        k--;
    }

    printf("中位数:%d", t);

}

int main()
{
    Link s1, s2;
    Init(s1);
    Init(s2);

    Input(s1);
    Input(s2);

    Func(s1, s2);

    return 0;
}

三组测试用例

11 13 15 17 19 9999
2 4 6 8 20 9999

1 2 3 4 5 6 7 8 9 10 11 12 13 14 9999
1 2 3 9999

1 2 3 9999
1 2 3 4 5 6 7 8 9 10 11 12 13 14 9999
 

 

Logo

汇聚原天河团队并行计算工程师、中科院计算所专家以及头部AI名企HPC专家,助力解决“卡脖子”问题

更多推荐