两个有序链表序列的合并

两个有序链表序列的合并

/2018.1.2 一木/

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

输入格式:

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

输出格式:

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

输入样例:

    1 3 5 -1
    2 4 6 8 10 -1

输出样例:

    1 2 3 4 5 6 8 10


    #include <stdio.h>

    typedef struct Node* PtrToNode;
    struct Node{
    int data;
    PtrToNode next;
    };
    typedef PtrToNode List;

    //创建一个链表存储数据并且返回链表的首地址
    List Read(void);

//将上面两个链表进行合并,返回新的链表的首地址
List Merge(List L1, List L2);

//打印出合并后链表的数据
void Print(List L);

int main()
{
    List L1, L2, L;
    L1 = Read();
    L2 = Read();
    L = Merge(L1, L2);
    Print(L);
    return 0;
}

//创建一个链表存储数据并且返回链表的首地址
List Read(void)
{
    List L = (List)malloc(sizeof(struct Node));
    int tag = 0;//临时变量用来存放每次接受的值是否为-1,不是-1后再将值赋给结点中的数据域,是-1则退出循环
    List pre = NULL, r = L;//r为当前链表的最后结点的首地址,注意在结点插入结束时要更新r

    while(1){
        scanf("%d", &tag);
        if(tag == -1){
            break;
        }else{
            pre = (List)malloc(sizeof(struct Node));
            pre->data = tag;
            r->next = pre;
            r = pre;
        }
    }
    r->next = NULL;
    return L;
}

//两个有序链表的合并,我在最后直接返回空的头结点的首地址
List Merge(List L1, List L2)
{
    List L = (List)malloc(sizeof(struct Node));
    L->next = NULL;
    List p1 = L1->next, p2 = L2->next;//传过来的两个链表的头结点也为空
    List r = L;

    if(p1 && p2){//先看一下两个链表中是否都不为空

        while(p1 && p2){
            if(p1->data <= p2->data){
                r->next = p1;
                r = p1;
                p1 = p1->next;
            }else{
                r->next = p2;
                r = p2;
                p2 = p2->next;
            }
        }
        r->next = p1? p1 : p2;
        return L;
    }else{//如果至少有一个为空,那么将不空的链接在后面,两个都为空也可以这样处理
        r->next = p1? p1 : p2;
        return L;
    }
}


void Print(List L)
{
   if(L->next){
        List r = L, p;
        while(r->next->next){
            p = r->next;
            r = p;
            printf("%d ", p->data);
        }
        p = r->next;
        printf("%d", p->data);
   }else{
        printf("NULL");
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值