链表——两个有序链表序列的合并

来源:互联网 发布:java获取访问者的ip 编辑:程序博客网 时间:2024/06/14 04:36

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的并集新非降序链表S3。

输入格式:

输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用表示序列的结尾(不属于这个序列)。数字用空格间隔。

输出格式:

在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL

输入样例:

1 3 5 -12 4 6 8 10 -1

输出样例:

1 2 3 4 5 6 8 10
#include<bits/stdc++.h>using namespace std;#define OK 1#define ERROR 0typedef int Status;typedef int ElemType;typedef struct LNode *List;typedef struct LNode{    ElemType data;    struct LNode *next;} LNode,*LinkList;Status InitList(LinkList &L){    L = new LNode;    L -> next = NULL;    return OK;}Status IsEmpty(LinkList &L){    if(L == NULL || L -> next == NULL)    {        return OK;    }    else        return ERROR;}Status CreatList(LinkList &L){    LNode *p,*q;    L = new LNode;    L ->next = NULL;    p = L;//指向链表头结点    q = new LNode;//新结点    ElemType e;    cin>>e;    while(e != -1)    {        q -> data = e;//新结点赋值e        q -> next = NULL;//将next置空        p -> next = q;//链表指向新结点,后插法        p = q;        q = new LNode;        cin>>e;//输入直到-1    }}void PrintList(LinkList &L){    LNode *p = L ->next;    while(p)    {        if(p -> next == NULL)        {            cout<<p -> data<<endl;        }        else            cout<<p -> data<<" ";        p = p -> next;    }}Status MergeList(LinkList &L1,LinkList &L2,LinkList &L3){    LNode *p1 = L1 -> next;    LNode *p2 = L2 -> next;    L3 = L1;//L1头结点作为L3头结点    LNode *p3 = L3;    while(p1 && p2)    {        if(p1->data < p2 -> data)        {            p3 -> next = p1;            p3 = p1;            p1 = p1 -> next;        }        else        {            p3 -> next = p2;            p3 = p2;            p2 = p2 -> next;        }    }    p3 -> next = p1 ? p1 :p2;//若有一个未到达末尾直接接到L3    delete L2;}int main(){    LinkList L1,L2,L3;    InitList(L1);    InitList(L2);    InitList(L3);    CreatList(L1);    CreatList(L2);    MergeList(L1,L2,L3);    if(IsEmpty(L3))    {        cout<<"NULL"<<endl;    }    else        PrintList(L3);}




原创粉丝点击