将两个非递增的有序链表合并为一个非递减的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据

本文介绍如何将两个非递增有序链表合并为一个非递减有序链表,要求不使用额外空间,并提供C++实现。首先通过比较合并为递减链表,然后对链表进行逆序操作,以满足题目要求。
摘要由CSDN通过智能技术生成

将两个非递增的有序链表合并为一个非递减的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据操作的名称和参数使用下列结构:La和Lb表示将要合并的链表,合并后的新表使用头指针Lc指向。

void MergeList(LinkList& La, LinkList& Lb, LinkList& Lc)

在这里插入图片描述

网上查到的大部分是两个非递减(即递增)的有序链表,书上的也是非递减链表合并成非递减(递增)链表,而题目要求的是非递增(即递减)的有序链表合并为递增。所以我打算合并为一个递减链表后再将链表逆序得到一个递增的链表以完成题目要求。

书上的两个非递减有序链表合并为一个非递减链表代码,参考用:

在这里插入图片描述
值得一提的是函数参数中的 &L 是c++独有的引用,相对于C的指针传参不但可以改变实参的值,而且引用初始化后不可以被更改,据说这样比指针操作更安全,目前我就当做和指针传参理解。

C++代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
   
    int data;
    struct Node *next;
} Node;
typedef struct Node *LinkList;

void InitList(LinkList &L); // 创建空链表和本题无关
void Creat_LinkList(LinkList &L, int len); // 通过输入指定数量的值创建链表
void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc); // 合并两个递减有序链表为一个
void reverse(LinkList &La); // 将递减的链表逆序为递增的
void showlinklist(LinkList &L); // 打印出链表
int main(int argc, char const *argv[])
{
   
    LinkList La = 0, Lb = 0, Lc;
    // puts("递减链表La"); // 5 4 3 2 1
    Creat_LinkList(La, 5);
    printf("La链表为:");
    showlinklist(La);

    // puts("\n递减链表Lb"); // 9 8 7 6 5
    Creat_LinkList(Lb, 5);
    printf("Lb链表为:");
    showlinklist(Lb);

    puts("\n合并为递增的有序链表:");
    MergeList(La, Lb, Lc);
    showlinklist(Lc);


    return 0;
}

void InitList(LinkList &L)
{
   
    L = new Node;
    L->data = 66;
    L->next = NULL;
  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值