描述

已知两个严格单调递增的表a(长度为n,n≤10000)和表b(长度为m,m≤10000),其中数据均为正整数,将其合并成一个严格单调递增的表


格式

输入格式

输入为3行,第一行两个数n和m,表示序列的长度。第二行是一个长度为n的表a,第三行是长度为m的表b。

输出格式

输出合并后的表c


样例

输入样例

5 6
2 4 7 9 12
3 4 8 9 12 15

输出样例

2 3 4 7 8 9 12 15


限制

时间限制:500 ms
内存限制:32767 KB


代码:
way1

  1. #include<stdio.h>
  2. struct node
  3. {
  4. int data[205];
  5. int lenth;
  6. }La, Lb, Lc;
  7. int main()
  8. {
  9. int n, m, i, j;
  10. int ans = 0;
  11. scanf("%d", &m);
  12. scanf("%d", &n);
  13. for (i = 0; i < m; i++)
  14. {
  15. scanf("%d", &La.data[i]);
  16. }
  17. La.lenth = m;
  18. for (i = 0; i < n; i++)
  19. {
  20. scanf("%d", &Lb.data[i]);
  21. }
  22. Lb.lenth = n;
  23. int x, y;
  24. for (x = 0; x < n; x++)
  25. {
  26. int flag = 0;
  27. for (y = 0; y < m; y++)
  28. {
  29. if (flag == 1)
  30. {
  31. y = y - 1;
  32. flag = 0;
  33. }
  34. if (La.data[x] == Lb.data[y])
  35. {
  36. int t;
  37. for (t = y; t < Lb.lenth-1; t++)
  38. {
  39. Lb.data[t] = Lb.data[t + 1];
  40. }
  41. Lb.lenth--;
  42. flag = 1;
  43. }
  44. }
  45. }
  46. int k = 0;
  47. Lc.lenth = 0;
  48. i = 0; j = 0;
  49. while (i != La.lenth && j != Lb.lenth)
  50. {
  51. if (La.data[i] <= Lb.data[j])
  52. {
  53. Lc.data[k] = La.data[i];
  54. i++;
  55. k++;
  56. Lc.lenth++;
  57. }
  58. else
  59. {
  60. Lc.data[k] = Lb.data[j];
  61. j++;
  62. k++;
  63. Lc.lenth++;
  64. }
  65. }
  66. if (i != La.lenth)
  67. {
  68. for (i; i < La.lenth; i++)
  69. {
  70. Lc.data[k] = La.data[i];
  71. k++;
  72. Lc.lenth++;
  73. }
  74. }
  75. if (j != Lb.lenth)
  76. {
  77. for (j; j < Lb.lenth; j++)
  78. {
  79. Lc.data[k] = Lb.data[j];
  80. k++;
  81. Lc.lenth++;
  82. }
  83. }
  84. int l;
  85. for (l = 0; l < Lc.lenth; l++)
  86. {
  87. if (l != 0)
  88. printf(" ");
  89. printf("%d", Lc.data[l]);
  90. }
  91. printf("\n");
  92. return 0;
  93. }

way2

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define ERROR 0;
#define MAX 20

typedef struct
{
    int* elem;
    int lenth;
    int listsize;

} SqList;

void CreatList(SqList &L, int n, int* a)
{

    L.elem = (int*)malloc(MAX * sizeof(int));
    if (!L.elem)
    {
        return;
    }
    L.listsize = MAX;
    L.lenth = n;
    int i;
    for (i = 0; i < n; i++)
    {
        L.elem[i] = a[i];
    }
}

void DeleteList(SqList* La, SqList Lb)
{
    int p,q;

    for (p = 0; p < Lb.lenth; p++)
    {
        int flag=0;
        for (q = 0; q < La->lenth; q++)
        {

            if (flag == 1)
            {
                q = q - 1;
                flag = 0;
            }
            if (Lb.elem[p] == La->elem[q])
            {
                int t;
                for (t = q; t < La->lenth; t++)
                {
                    La->elem[t] = La->elem[t + 1];
                }
                La->lenth--;
                flag = 1;
            }
        }
    }

}

void Traverse(SqList L)
{
    int j;
    for (j = 0; j < L.lenth; j++)
    {
        if (j != L.lenth - 1)
        {
            printf("%d ", L.elem[j]);
        }
        else
        {
            printf("%d\n", L.elem[j]);
        }


    }

}

void  Merge(SqList* L1, SqList L2,SqList Lm)
{


    int h=0, u=0, l=0;
    while (h < L1->lenth && u < L2.lenth)
    {
        if (L1->elem[h] < L2.elem[u])
        {
            Lm.elem[l++] = L1->elem[h++];
        }
        else
        {
            Lm.elem[l++] = L2.elem[u++];
        }

    }
    while (h < L1->lenth)
    {
        Lm.elem[l++] = L1->elem[h++];
    }
    while(u < L2.lenth)
    {
        Lm.elem[l++] = L2.elem[u++];
    }
    Lm.lenth = l;

    Traverse(Lm);

}







int main()
{
    int m, n;
    int a[201], b[201],T[201];
    scanf("%d%d", &n, &m);
    int i, j;
    for (i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    for (j = 0; j < m; j++)
    {
        scanf("%d", &b[j]);
    }

    SqList L1, L2,Lm;
    CreatList(Lm, MAX, T);

    CreatList(L1, n, a);
    CreatList(L2, m, b);
    DeleteList(&L1, L2);
    Merge(&L1, L2,Lm);

    return 0;
}