数据结构实验---合并两个非递减链表

描述

给定两个递增的整数序列A和B,利用链表表示序列A和B,将A和B合并为一个递增的有序序列C,序列C不允许有重复的数据。要求空间复杂度为O(1)。

输入

多组数据,每组数据有三行,第一行为序列A和B的长度n和m,第二行为序列A的n个元素,第三行为序列B的m个元素(元素之间用空格分隔)。n=0且m=0时输入结束。

输出

对于每组数据输出一行,为合并后的序列,每个数据之间用空格分隔。

输入样例 1

5 5
1 3 5 7 9
2 4 6 8 10
3 4
1 5 9
1 2 5 9
0 0

输出样例 1

1 2 3 4 5 6 7 8 9 10
1 2 5 9

#include<iostream>
using namespace std;
typedef struct LNode* List;
struct LNode {
    int data;
    List next;
};
void InitList(List &L)
{
    L = new LNode;
    L->next = NULL;
}
void CreatList(List &L,int num)
{
    L = new LNode;
    L->next = NULL;
    List r = L;
    for (int i = 0; i < num; i++)
    {
        List p = new LNode;
        cin >> p->data;
        p->next = NULL;
        r->next = p;
        r = p;
    }
}
List MergeList(List a,List b )
{
    List c;
    List pa, pb, pc;
    pa = a->next;
    pb = b->next;
    c = a;
    pc = c;
    while (pa&&pb)
    {
        if (pa->data < pb->data)
        {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        }
        else
        {
            if (pa->data > pb->data)
            {
                pc->next = pb;
                pc = pb;
                pb = pb->next;
            }
            else
                if (pa->data == pb->data)
                {
                    pc->next = pa;
                    pc = pa;
                    pa = pa->next;
                    pb = pb->next;
                }
        }
    }
    pc->next = pa ? pa : pb;//如果不是pa,可能是a 空了 
    delete b;
    return c;
}
void Print(List L)
{
    List p = L->next;
    while (p->next)
    {
        cout << p->data << " ";
        p = p->next;
    }
    cout << p->data<<endl;
}
int main()
{
    int n, m;
    while (cin>>n>>m&&(n != 0 || m != 0))
    {
        List A, B;
        CreatList(A, n);
        CreatList(B, m);
        List C=MergeList(A, B);
        Print(C);
    }
    return 0;
}

 

posted @ 2019-10-14 16:46  Tomorrow1126  阅读(697)  评论(0编辑  收藏  举报