B : DS单链表--合并

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

int LL_merge(ListNode *La, ListNode *Lb)

Input

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

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

Output

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

Sample

#0
Input

Copy

3 11 33 55
4 22 44 66 88
Output

Copy

11 22 33 44 55 66 88 
#include
using namespace std;
#define ok 0
#define error -1

// 链表结点定义
class ListNode
{
public:
    int data;
    ListNode* next;
    ListNode() { next = NULL; }
};
// 带头结点的单链表类定义
class LinkList
{
public:
    ListNode* head;
    int len;
    // 操作定义
    LinkList();
    ~LinkList();
    ListNode* LL_index(int i);      // 返回第i个结点的指针,如果不存在返回NULL
    int LL_get(int i);              // 获取第i个元素的数据
    int LL_insert(int i, int item); // 把数值item插入第i个位置
    int LL_del(int i);              // 删除第i个结点
    void LL_display();              // 输出单链表的内容
    int LL_merge(ListNode* La, ListNode* Lb);//合并
};
LinkList::LinkList()
{
    head = new ListNode();
    len = 0;
}
LinkList::~LinkList()
{
    ListNode* p, * q;
    p = head;
    while (p != NULL)
    {
        q = p;
        p = p->next;
        delete q;
    }
    len = 0;
    head = NULL;
}
void LinkList::LL_display()
{
    ListNode* p;
    p = head->next;
    while (p)
    {
        cout << p->data << ' ';
        p = p->next;
    }
    cout << endl;
}

// 返回第i个结点的指针,如果不存在返回NULL  找链表第i个结点
ListNode* LinkList::LL_index(int i)
{
    int j = 0;
    ListNode* p = head;//指向头指针
    while (p && j < i)//遍历
    {
        p = p->next;
        j++;
    }
    if (!p) return NULL;
    else return p;
}

//获得数据 获取第i个元素的数据
int LinkList::LL_get(int i)
{
    if (i <= 0 || i > len) return error;
    int j = 0;
    ListNode* p = head;//指向头指针 
    while (p && j < i)//遍历
    {
        p = p->next;
        j++;
    }
    if (!p) return error;
    else return p->data;
}

//插入
int LinkList::LL_insert(int i, int item)
{
    //判断存在
    if (i <= 0 || i > len + 1) return error;
    else
    {
        ListNode* p;
        ListNode* pr = head;
        p = head->next;//p指向头节点后一位
        ListNode* n;
        for (int j = 1; j < i; j++) {
            if (p != NULL) {
                pr = p;
                p = p->next;//p和pr都往下走一位
            }
        }//循环结束此时pr为i-1 p为i
        n = new ListNode;//为其分配内存空间
        n->data = item;
        //这里进行插入操作 将n插入到第i个位置
        pr->next = n;
        n->next = p;
        len++;
        return 1;
    }
  
}

//删除
int LinkList::LL_del(int i)
{
    if (i <= 0 || i > len) return error;
    ListNode* p, * s;
    p = LL_index(i - 1);//p是链表第i-1
    s = p->next;//s是p的下一位 s是i
    p->next = s->next;//p的下一位 是s的下一位   p过后是i+1
    //这样子就跳过了i
    delete s;
    len--;
    return ok;
}

//合并
int LinkList::LL_merge(ListNode* La, ListNode* Lb) {
    while (La && Lb)//节点都得存在
    {
        if (La->data > Lb->data)
        {
            this->LL_insert(++len, Lb->data);//b值小 所以插入b值
            Lb = Lb->next;//Lb往后走一位
        }
        else//同理插入a
        {
            this->LL_insert(++len, La->data);
            La = La->next;
        }
    }
    //ab链表长度不一样的情况  较长的链表还要继续插入
    while (La) {
        this->LL_insert(++len, La->data);
        La = La->next;
    }
    while (Lb) {
        this->LL_insert(++len, Lb->data);
        Lb = Lb->next;
    }
    return ok;
}
int main()
{
    int n, m;
    LinkList mylist1;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {

        cin >> m;
        mylist1.LL_insert(i, m);//插入
    };
   // mylist1.LL_display();
    LinkList mylist2;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {

        cin >> m;
        mylist2.LL_insert(i, m);//插入
    }
   // mylist2.LL_display();
    LinkList mylist;
    mylist.LL_merge(mylist1.head->next, mylist2.head->next);//合并
    mylist.LL_display();
}

你可能感兴趣的:(oj——数据结构,算法)