两个有序链表序列的合并

已知两个非降序链表序列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>

#include <stdlib.h>

struct LNode {

    int data;

    struct LNode *next;

};

struct LNode*creatlist()

{

    struct LNode *p,*t,*head;

    int i;

    head=(struct LNode *)malloc(sizeof(struct LNode));//给头节点分配空间

    t=head;//用一个手抓住头节点

    while(scanf("%d",&i)&&i>=0)//当输入并且输入不为—1时进入循环

    {

        p=(struct LNode*)malloc(sizeof(struct LNode));//为节点分配空间

        p->data=i;//把输入的数放在新节点的数值部位

        p->next =NULL;//初始化新节点的指针域

        t->next=p;//在头结点后面安上新节点

        t=p;//把手放在新节点上

    }

    return head;

}

struct LNode*ADDlist(struct LNode *L1,struct LNode *L2)

{

    struct LNode *p1,*p2,*p3,*L3;//生成三个手

    p1=L1->next;//抓住链表一的第一个节点

    p2=L2->next ;//抓住链表二的第一个节点

    L3=(struct LNode*)malloc(sizeof(struct LNode));//为链表三的头节点分配空间

    L3->next =NULL;//初始化指针域

    p3=L3;//抓住链表三的头节点

    while(p1&&p2)//当手里都有东西的时候进入循环

    {

        if(p1->data>p2->data)//如果链表二的数据小

        {

            p3->next =p2;//拿着链表三的头节点直接怼在链表二上面

            p2=p2->next ;//把抓着链表二的手往后挪一位

        } else {//否则

            p3->next =p1;//拿着链表三的头节点直接怼在链表一上面

            p1=p1->next ;//把抓着链表一的手往后挪一位

        }

        p3=p3->next ;//把抓着链表三的手往后挪一位

    }

    if(p1)//跳出循环有两种可能的情况,如果链表一的元素没用完

    {

        p3->next =p1;//直接将链表三怼在链表一上面就行了

    } else {//或者

        p3->next =p2;//直接将链表三怼在链表二上面就行了

    }

    return L3;

}

void print(struct LNode *L3)

{

    struct LNode *p;

    p=(struct LNode *)malloc(sizeof(struct LNode));

    p=L3->next;//用手抓住链表三的第一个节点

    if(p==NULL)//如果手里没东西

    {

        printf("NULL");//接打印null

        return;

    }

    while(p!=NULL)//如果手里有东西就进入循环

    {

        printf("%d",p->data);//就打印数据

        p=p->next;//把手往后挪一位

        if(p!=NULL)//如果在挪了一位之后手里拿着的还不是空的,说明后面还有元素,就打印个空格,最后一个元素后面不用打空格

            printf(" ");

    }

}

int main()

{

    struct LNode *L1,*L2,*L3;//创建三个节点用于存放生成链表的头节点

    L1=creatlist();//生成链表一放置第一列元素

    L2=creatlist();//生成链表二放置第二列元素

    L3=ADDlist(L1,L2);//合并链表一二并把结果放在链表三中

    print(L3);//打印链表三

    return 0;

}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值