解题思路:
输入线性表LA,LB

据算法:首先i=0指向LA第一个元素,j=0指向LB第一个元素,k=0指向LC第一个元素

从LA,LB中第一个元素开始比较,若LA[i]<=LB[j]  ,则LC[k]=LA[i],同时i++,k++(i,k指针后移)
若LA[i]>LB[j]  ,则LC[k]=LB[j],同时j++,k++(j,k指针后移)

以上比较,插入操作当LA或者LB有一个遍历完结束

把未遍历完的表(LA或LB)中未遍历的部分加到LC最后一个元素后面

按要求输出LC


注意事项:
题目中:m大于等于0  n大于等于0,当输入的m和n 都为0 时,不能有任何输出,直接换行合并下一组数据
在代码中加了排序,怕输入数据不是非递减
参考代码:

#include<stdio.h>
#include<malloc.h>
int * creat_LA(int m);
int * creat_LB(int n);
int * creat_LC(int *LA,int *LB,int x,int m,int n);
void output_LC(int *LC,int x);
void sort_(int *L,int d);
/*在代码中加了排序,怕输入数据不是非递减*/
int main()
{
   int *LA=NULL,*LB=NULL,*LC=NULL;
   int m,n;

   while(scanf("%d",&m)!=EOF)
     {

         LA=creat_LA(m);
         scanf("%d",&n);
         LB=creat_LB(n);

         LC=creat_LC(LA,LB,m+n,m,n);
         if(m==0&&n==0)
         printf("\n");
         else
         output_LC(LC,n+m);

         free(LA);
         free(LB);
         free(LC);

     }
return 0;
}
/*---------------------------------------------*/
int * creat_LA(int m)
{
   int *la=(int *)malloc(m*sizeof(int));

     for(int i=0;i<m;i++)
      scanf("%d",&la[i]);

     sort_(la,m);
      return la;

}
/*---------------------------------------------*/
int * creat_LB(int n)
{
   int *lb=(int *)malloc(n*sizeof(int));

     for(int i=0;i<n;i++)
      scanf("%d",&lb[i]);

     sort_(lb,n);
      return lb;

}
/*---------------------------------------------*/
int * creat_LC(int *LA,int *LB,int x,int m,int n)
{

    int *lc=(int *)malloc(x*sizeof(int));

    int i=0,j=0,k=0;

    while(i<m&&j<n)
        if(LA[i]<=LB[j])
             lc[k++]=LA[i++];
           else
             lc[k++]=LB[j++];
    

    while(i<m)
    lc[k++]=LA[i++];

    while(j<n)
    lc[k++]=LB[j++];
 
return lc;
}
/*---------------------------------------------*/
void output_LC(int *LC,int x)
{
   for(int i=0;i<x-1;i++)
    printf("%d ",LC[i]);
    printf("%d\n",LC[x-1]);
}
/*---------------------------------------------*/
void sort_(int *L,int d)
{

   int min,term;

   for(int i=0;i<d;i++)
    {
       min=i;
       for(int j=i;j<d;j++)
          {
             if(L[j]<L[min])
             min=j;
          }

          term=L[i];
          L[i]=L[min];
          L[min]=term;

    }

}

别忘点赞哦-.-!

点赞(18)
 

0.0分

7 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 10 条评论

新人小白 5年前 回复TA
@小白到大神 像博主说的注意事项里,没有考虑m=0,n=0时的情况
小白到大神 5年前 回复TA
traverseList(pHead3);

    return 0;
}
大佬帮忙看看哪里出了错,codeblock输入样例运行正确,但是提交后错误50%,谢谢了。
小白到大神 5年前 回复TA
while (q != NULL)
    {
        PNODE pNew = (PNODE)malloc(sizeof(NODE));
        pNew->data = q->data;
        q = q->pNext;
        pTail->pNext = pNew;
        pNew->pNext = NULL;
        pTail = pNew;
    }

    return pHead3;
}

void traverseList(PNODE pHead)
{
    PNODE p = pHead->pNext;

    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->pNext;
    }
    return;
}

int main(void)
{
    int m, n;

    scanf("%d", &m);
    PNODE pHead1 = createList(m);

    scanf("%d", &n);
    PNODE pHead2 = createList(n);


    PNODE pHead3 = mergeList(pHead1, pHead2, m, n);
小白到大神 5年前 回复TA
if (p->data <= q->data)
            {
                pNew->data = p->data;
                p = p->pNext;
            }
            else if (p->data > q->data)
            {
                pNew->data = q->data;
                q = q->pNext;
            }
            pTail->pNext = pNew;
            pNew->pNext = NULL;
            pTail = pNew;
        }
    }

    while (p != NULL)
    {
        PNODE pNew = (PNODE)malloc(sizeof(NODE));
        pNew->data = p->data;
        p = p->pNext;
        pTail->pNext = pNew;
        pNew->pNext = NULL;
        pTail = pNew;
    }
小白到大神 5年前 回复TA
PNODE mergeList(PNODE pHead1, PNODE pHead2, int m, int n)
{
    int i;

    if (pHead1 == NULL || pHead2 == NULL)
    {
        printf("error");
        exit(-1);
    }

    PNODE p = pHead1->pNext;
    PNODE q = pHead2->pNext;
    PNODE pHead3 = (PNODE)malloc(sizeof(NODE));
    PNODE pTail = pHead3;
    pTail->pNext = NULL;

    if (pHead3 == NULL)
    {
        printf("error");
        exit(-1);
    }

    for (i = 0; i < m + n; i++)
    {
        while (p != NULL && q != NULL)
        {
            PNODE pNew = (PNODE)malloc(sizeof(NODE));
小白到大神 5年前 回复TA
#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
    int data;
    struct Node *pNext;
}NODE, *PNODE;

PNODE createList(int len)
{
    int i;

    PNODE pHead = (PNODE)malloc(sizeof(NODE));
    PNODE pTail = pHead;
    pTail->pNext = NULL;

    if (pHead == NULL)
    {
        printf("error");
        exit(-1);
    }

    for (i = 0; i < len; i++)
    {
        PNODE pNew = (PNODE)malloc(sizeof(NODE));

        scanf("%d", &pNew->data);

        pTail->pNext = pNew;
        pNew->pNext = NULL;
        pTail = pNew;
    }

    return pHead;
}
MOYU墨鱼 5年前 回复TA
感谢,就是没想到都是0要直接换行解决下一组数据
Merlin 6年前 回复TA
代码贴不上来。。。。。。
Merlin 6年前 回复TA
大佬帮我看下这个哪里有问题好嘛,提交总是运行错误,我实在是找不到
Merlin 6年前 回复TA
#include <stdio.h>
#include <stdlib.h>
#define max 101
typedef int DataType;
typedef struct
{
DataType date[max];
int length;
}Seqlist;
void InitList(Seqlist *L)
{
L->length=0;
}
void create(Seqlist *L,DataType n)
{
int i;
for(i=0;i<n;i++)
scanf("%d",&L->date[i]);
L->length=i;
}
void change(Seqlist *L1,Seqlist *L2,Seqlist *L3)
{
int i=0,j=0,k=0;
while(i<L1->length&&j<L2->length)
{
if(L1->date[i]<=L2->date[j])
{
L3->date[k]=L1->date[i];
k++;
i++;
}
else
{
L3->date[k]=L2->date[j];
k++;
j++;
}
}
if(i==L1->length)
{
while(j<L2->length)
{
L3->date[k]=L2->date[j];
k++;
j++;
}
}
if(j==L2->length)
{
w