数据结构-链表-有序单链表的合并

Description
根据输入分别创建两个(递增)有序单链表(有头结点),并将其合并为一个新的(递增)有序链表。
Input
第一行:输入第一个链表的长度n(1<n<1000)
第二行:输入第一个链表的元素值(整数)
第三行:输入第二个链表的长度k(1<k<1000)
第四行:输入第二个链表的元素值(整数),#表示结束标志。
Output
输出合并后新链表的元素值,用空格间隔。注:最后一个输出的整数后面没有空格和换行符。
Sample Input
5
12 23 38 56 67
6
7 10 25 56 6878 #
Sample Output
7 1012 23 25 38 56 67 68 78

#include <bits/stdc++.h>
using namespace std;

typedef struct Lnode
{
    int data, length;
    struct Lnode *next;
} Lnode, *Linklist;
void initL(Linklist &L)
{
    L = new Lnode;
    L->next = NULL;
}
void creatL(Linklist &L)
{ // 尾插创建
    int n;
    cin >> n;
    L->length = n;
    Lnode *p = new Lnode;
    p = L;
    for (int i = 0; i < n; i++)
    {
        Lnode *q = new Lnode;
        cin >> q->data;
        p->next = q;
        q->next = NULL;
        p = q;
    }
}
void ADD(Linklist L, Linklist T, Linklist &S)
{ // 新的链表,不会损坏原来链表
    S->length = L->length + T->length;
    Lnode *p = new Lnode;
    Lnode *q = new Lnode;
    Lnode *m = new Lnode;
    p = L->next;
    q = T->next;
    m = S;
    while (p && q)
    { // 都为尾插
        if (p->data < q->data)
        {
            Lnode *n = new Lnode;
            n->data = p->data;
            m->next = n;
            n->next = NULL;
            m = n;
            p = p->next;
        }
        else if (p->data > q->data)
        {
            Lnode *n = new Lnode;
            n->data = q->data;
            m->next = n;
            n->next = NULL;
            m = n;
            q = q->next;
        }
        else
        {
            Lnode *n = new Lnode;
            n->data = p->data;
            m->next = n;
            n->next = NULL;
            m = n;
            p = p->next;
            q = q->next;
            S->length--;
        }
    }
    while (p)
    { // 把没跑完的链表连上
        Lnode *n = new Lnode;
        n->data = p->data;
        m->next = n;
        n->next = NULL;
        m = n;
        p = p->next;
    }
    while (q)
    {
        Lnode *n = new Lnode;
        n->data = q->data;
        m->next = n;
        n->next = NULL;
        m = n;
        q = q->next;
    }
}
void ADDpro(Linklist &L, Linklist &T, Linklist &S)
{ // 新的链表,会损坏原来的两个
    Lnode *p = new Lnode;
    Lnode *q = new Lnode;
    Lnode *m = new Lnode;
    p = L->next;
    q = T->next;
    S = m = L;
    while (p && q)
    { // 直接在原来两个链表的基础上勾链
        if (p->data < q->data)
        {
            m->next = p;
            m = p;
            p = p->next;
        }
        else if (p->data > q->data)
        {
            m->next = q;
            m = q;
            q = q->next;
        }
        else
        {
            m->next = p;
            m = p;
            p = p->next;
            q = q->next;
            S->length--;
        }
    }
    m->next = p ? p : q; // 谁不空就续上谁
    S->length = L->length + T->length;
}
void printL(Linklist L)
{
    int m = 0;
    Lnode *n = new Lnode;
    n = L->next;
    for (int i = 0; i < L->length; i++)
    {
        cout << n->data;
        if (m != L->length - 1)
            cout << " ";
        m++;
        n = n->next;
    }
}
int main()
{
    Linklist L, T, S;
    initL(L);
    initL(T);
    initL(S);
    creatL(L);
    creatL(T);
    char c;
    cin >> c;
    ADDpro(L, T, S);
    printL(S);
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值