【思路+代码】7-3 两个有序链表序列的合并 (20 分)

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

思路:

首先,建立链表a,b;其次,对两个链表合并;最后输出。

1.设置函数建立链表p->data=a;str->next=p;str=p;head标记第一个数据,return head;

2.两个链表的合并,先判断是否有空表,有空直接返回另一个表,无空的话,判断两链表data大小,小的s->data=小的->data;d->next=s;d=s;head标记的第一个数据,return head

代码:

#include <stdio.h>
#include <stdlib.h>
struct node {
    int data;
    struct node *next;
};
struct node *build();
struct node *operate(struct node *a,struct node *b);
int main()
{
    struct node *a,*b,*c;
    a = build();
    b = build();
    c = operate(a,b);
    if(!c)
        printf("NULL\n");
    while(c)
    {
        if(c->next==NULL)
            printf("%d",c->data);
        else
            printf("%d ",c->data);
        c = c->next;
    }
    return 0;
}
struct node *build()
{
    struct node *head=NULL,*str=NULL;
    int a;
    scanf("%d",&a);
    while(a!=-1)
    {
        struct node *p = (struct node *)malloc(sizeof(struct node));
        p->data = a;
        p->next = NULL;
        if(NULL==head)
            head=p;
        else
            str->next=p;
        str = p;
        scanf("%d",&a);
    }
    return head;
};
struct node *operate(struct node *a,struct node *b)
{
    struct node *p,*q,*d=NULL;
    struct node *s,*head=NULL;
    p=a;
    q=b;
    if(p==NULL)
        return q;
    if(q==NULL)
        return p;
    while(p&&q)
    {
       s=(struct node *)malloc(sizeof(struct node));
       if((p->data)<(q->data))
       {
           s->data=p->data;
           s->next=NULL;
           p=p->next;
       }
       else
       {
           s->data=q->data;
           s->next=NULL;
           q=q->next;
       }
        if(head==NULL)
            head=s;
        else
            d->next=s;
        d=s;
    }
    if(p)
        d->next=p;
    if(q)
        d->next=q;
    return head;
    }

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 答:我们可以使用递归或迭代的方法将两个有序链表合并成一个有序链表。首先比较两个链表的头节点,将小的一个作为新链表的头节点,并递归或迭代地将剩下的节点与另一个链表的头节点比较。直到其中一个链表为空,将另一个链表剩余的节点直接接到新链表的尾部即可。具体实现可以参考以下代码: // 递归方法 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if (l1 == nullptr) return l2; if (l2 == nullptr) return l1; if (l1->val <= l2->val) { l1->next = mergeTwoLists(l1->next, l2); return l1; } else { l2->next = mergeTwoLists(l1, l2->next); return l2; } } // 迭代方法 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode dummy(0); ListNode* tail = &dummy; while (l1 != nullptr && l2 != nullptr) { if (l1->val <= l2->val) { tail->next = l1; l1 = l1->next; } else { tail->next = l2; l2 = l2->next; } tail = tail->next; } tail->next = l1 != nullptr ? l1 : l2; return dummy.next; } ### 回答2: 题目描述 输入两个升序排列的链表合并两个链表并使新链表中的元素仍然是升序排列的。 算法 链表合并,可以采用递归或者迭代的方式实现。具体思路如下: 递归解法 - 若链表1为空,则返回链表2作为结果 - 若链表2为空,则返回链表1作为结果 - 若链表1的头结点小于等于链表2的头结点,则将链表1的头结点作为合并链表的头结点,递归合并链表1的剩余部链表2 - 若链表1的头结点大于链表2的头结点,则将链表2的头结点作为合并链表的头结点,递归合并链表2的剩余部链表1 迭代解法 - 新建一个空链表作为结果链表 - 同时遍历链表1和链表2,比较当前结点的大小,将较小的结点插入到结果链表末尾,并将相应的链表指针后移 - 当其中一个链表遍历完毕后,将另一个链表接到结果链表末尾。 无论是递归还是迭代,时间复杂度均为 O(m+n),其中 m 和 n 别为两个链表的长度。 Python代码 ### 回答3: 7-3题目要求我们将两个有序链表序列合并成一个有序链表序列。这个一个常见的操作,在实际开发中也很常见。因此,这道题涉及到的知识点也比较重要。 首先,我们需要梳理一下有序链表的基本概念。有序链表是一种特殊的链表,其中的元素按照一定的顺序排列。常见的有序链表有单向链表和双向链表。在这道题中,两个有序链表序列已经给出,因此我们需要对这两个链表进行遍历,按照顺序逐个比较节点的数值大小,将较小的节点添加到新的有序链表中,直到将两个链表合并为一个有序链表。 具体来说,我们可以定义三个指针,别指向两个原始有序链表和一个新的有序链表。初始化时,两个原始有序链表指针指向链表的头节点,新的有序链表指针指向空节点。然后,我们逐个比较两个原始有序链表指针所指节点的数值大小,将较小的节点添加到新的有序链表中,并将指向较小节点的原始有序链表指针向后移一位。这样,我们就可以逐步将两个原始有序链表的节点合并到新的有序链表中。当一个原始有序链表遍历完毕后,我们就可以直接将另一个原始有序链表中剩余的节点添加到新的有序链表中。最后,我们返回新的有序链表的头节点,完成链表合并操作。 总之,这道题的核心思想是遍历两个有序链表,比较节点的大小,将较小的节点添加到新的有序链表中。通过这个过程,我们可以实现两个有序链表序列合并
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上游

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值