首页 > 其他 > 详细

DS单链表--合并

时间:2020-01-10 20:59:38      阅读:229      评论:0      收藏:0      [点我收藏+]

题目描述

假定两个单链表是递增有序,定义并实现以下函数,完成两个单链表的合并,继续保持递增有序

int LL_merge(ListNode *La, ListNode *Lb)

输入

 

第1行先输入n表示有n个数据,接着输入n个数据
 
第2行先输入m表示有M个数据,接着输入m个数据
 

 

输出

输出合并后的单链表数据,数据之间用空格隔开

样例输入

3 11 33 55 4 22 44 66 88

样例输出

11 22 33 44 55 66 88

提示

#include<iostream>
using namespace std;
#define ok 0
#define error -1
class CNode
{
    int data;
    CNode *next;
public:
    CNode()
    {
        next=NULL;
    }
    CNode(int n,CNode *p)
    {
        data=n;
        next=p;
    }
    int getdata()
    {
        return data;
    }
    CNode *getnext()
    {
        return next;
    }
    void setnext(CNode *p)
    {
        next=p;
    }
};
 
 
class CList
{
    friend class CNode;
    CNode *head;
    int nodenumber;
public:
    CList()
    {
        head=NULL;
        nodenumber=0;
    }
    ~CList()
    {
        for(int i=0;i<nodenumber;i++)
        {
            CNode *p=head;
            head=head->getnext();
            delete p;
        }
    }
    void nodeplus()
    {
        nodenumber++;
    }
    void nodeminus()
    {
        nodenumber--;
    }
    void createTailList(int *num,int n)
    {
        CNode *tail;
        CNode *s;
        head=new CNode();
        tail=head;
        for(int i=0;i<n;i++)
        {
            s=new CNode(num[i],NULL);
            tail->setnext(s);
            tail=s;
            nodeplus();
        }
    }
    CNode *findreal(int i)
    {
        if(i<=0||i>nodenumber)
        {
            cout<<"error"<<endl;
            return NULL;
        }
        else
            return indexfind(i);
    }
    CNode *indexfind(int i)
    {
        if(i<0)
        {
            return NULL;
        }
        CNode *p=head;
        int k=1;
        while(k<=i&&p!=NULL)
        {
            p=p->getnext();
            k++;
        }
        return p;
    }
    int Insert(int i,int num)
    {
        if(i<=0||i>nodenumber+1)
        {
            cout<<"error"<<endl;
            return error;
        }
        nodeplus();
        CNode *p=indexfind(i-1);
        CNode *temp=new CNode(num,p->getnext());
        p->setnext(temp);
        return ok;
    }
    int Delete(int i)
    {
        if(i<1||i>nodenumber)
        {
            cout<<"error"<<endl;
            return error;
        }
        nodeminus();
        CNode *p=indexfind(i-1);
        CNode *temp=p->getnext();
        p->setnext(temp->getnext());
        delete temp;
        return ok;
    }
    void display()
    {
        CNode *p=head->getnext();
        while(p!=NULL)
        {
            cout<<p->getdata()<<" ";
            p=p->getnext();
        }
        cout<<endl;
    }
    void create()
    {
        head=new CNode();
        nodenumber=0;
    }
    friend CList beOne(CList &L1,CList &L2)
    {
        CList temp;
        temp.create();
        while(L1.head->getnext()!=NULL||L2.head->getnext()!=NULL)
        {
            if(L1.head->getnext()==NULL)
            {
                CNode *p=L2.head->getnext();
                temp.Insert(temp.nodenumber+1,p->getdata());
                L2.Delete(1);
            }
            else if(L2.head->getnext()==NULL)
            {
                CNode *p=L1.head->getnext();
                temp.Insert(temp.nodenumber+1,p->getdata());
                L1.Delete(1);
            }
            else
            {
                CNode *p1=L1.head->getnext();
                CNode *p2=L2.head->getnext();
                if(p1->getdata()<=p2->getdata())
                {
                    temp.Insert(temp.nodenumber+1,p1->getdata());
                    L1.Delete(1);
                }
                else if(p1->getdata()>p2->getdata())
                {
                    temp.Insert(temp.nodenumber+1,p2->getdata());
                    L2.Delete(1);
                }
            }
        }
        return temp;
    }
};
 
int main()
{
    int n;
    cin>>n;
    int *num1=new int[n];
    for(int i=0;i<n;i++)
    {
        cin>>num1[i];
    }
    CList L1;
    L1.createTailList(num1,n);
    cin>>n;
    int *num2=new int[n];
    for(int i=0;i<n;i++)
    {
        cin>>num2[i];
    }
    CList L2;
    L2.createTailList(num2,n);
    beOne(L1,L2).display();
    delete []num1;
    delete []num2;
    return 0;
}

DS单链表--合并

原文:https://www.cnblogs.com/SZU-DS-wys/p/12177900.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!