4 合并递增有序单链表

该博客讨论如何合并两个递增有序的单链表,要求保持元素递减有序,并利用原有链表节点,不创建新节点。文章提供函数接口定义、裁判测试程序样例、输入输出样例以及参考代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设有两个单链表A、B,其中元素递增有序,本题要求实现一个函数merge(LinkList A, LinkList B),将A、B归并成一个按元素值递减(允许有相同值)有序的链表C,要求用A、B中的原结点形成,不能重新申请结点。。

函数接口定义:

LinkList merge(LinkList A, LinkList B);

其中 A 和 B 都是用户传入的参数。 A 是单链表A的头指针; B 是单链表B的头指针。函数须返回单链表C的头指针。

裁判测试程序样例:

#define FLAG  -1
#include <stdio.h>
#include <malloc.h>
typedef int datatype;
typedef struct node
{
    datatype data;
    struct node *next;
}LNode, *LinkList;

LinkList Creat_LinkList();/*这里忽略函数的实现*/

LinkList merge(LinkList A, LinkList B);

void Print_LinkList(LinkList L);/*这里忽略函数的实现*/


int main()
{
    LinkList L,L1,L2;


    L1 = Creat_LinkList();
    if(L1 == NULL)
    { 
        printf("L1=NULL,error!"); 
        return 0;  
    }

    L2 = Creat_LinkList();
    if(L2 == NULL)
    { 
        printf("L2=NULL,error!"); 
        return 0;  
    }

    L = merge(L1, L2);

    Print_LinkList(L);

    return 0;
}
/* 请在这里填写答案 */

输入样例:

在这里给出一组输入。例如:

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

输出样例:

在这里给出相应的输出。例如:

    10     9     8     8     7     6     5     4     3     2     1

 

 

 参考代码

LinkList merge(LinkList A, LinkList B) {
    int i, j, data_a, data_b, sum_a = 0, sum_b = 0;
    LinkList p_a, q_a, r_a, p_b, q_b, r_b;

    // 备份链表 A 的头节点到 p_a,q_a 和 r_a,以便后面使用
    p_a = A;
    q_a = A;
    r_a = A;

    // 备份链表 B 的头节点到 p_b,r_b,以便后面使用
    p_b = B;
    r_b = B;

    // 计算链表 A 的节点数量,存储在 sum_a 中
    while (A->next) {
        A = A->next;
        sum_a++;
    }

    // 计算链表 B 的节点数量,存储在 sum_b 中
    while (B->next) {
        B = B->next;
        sum_b++;
    }

    // 将链表 B 的尾部节点连接到链表 A 的尾部
    B = r_b;
    A->next = B->next;
    A = r_a;

    // 使用冒泡排序合并链表 A 和 B 中的元素
    for (i = 0; i < sum_a + sum_b; i++) {
        p_a = p_a->next;
        q_a = p_a;

        for (j = i + 1; j < sum_a + sum_b; j++) {
            q_a = q_a->next;
            if (q_a->data >= p_a->data) {
                // 如果链表 B 中的元素大于链表 A 中的元素,交换它们的值
                data_a = p_a->data;
                p_a->data = q_a->data;
                q_a->data = data_a;
            }
        }
    }

    return A; // 返回合并后的链表 A
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值