【算法设计题】合并两个非递减有序链表,第1题(C/C++)

news2024/9/23 7:22:04

目录

第1题 合并两个非递减有序链表

得分点(必背)

题解

函数声明与初始化变量:

初始化合并链表的头节点:

合并两个链表:

处理剩余节点:

返回合并后的链表:

完整测试代码


🌈 嗨,我是命运之光!

🌌 2024,每日百字,记录时光,感谢有你,携手前行~

🚀 携手启航,我们一同深入未知的领域,挖掘潜能,让每一步成长都充满意义。


第1题 合并两个非递减有序链表

已知带头节点单链表 LA LB ,其元素均为非递减有序排列,编写算法利用原表结点空间,将链表 LA LB 合并为非递减有序序列的单链表 LC

得分点(必背)

// 合并两个非递减有序链表(得分点)
LinkList mergeLists(LinkList lista, LinkList listb){
    LinkList listc, p = lista, q = listb, r;
//listc指向lista 和 listb所指结点中较小者
//初始化合并链表的头节点
    if(lista->data<=listb->data){
        listc=lista;
        r=lista;
        p=lista->next;
    }
    else{
        listc=listb;
        r=listb;
        q=listb->next;
    }
//合并两个链表
    while(p!=NULL && q!=NULL){
        if(p->data<=q->data){
            r->next=p;
            r=p;
            p=p->next;
        }
        else{
            r->next=q;
            r=q;
            q=q->next;
        }
    }
    r->next=(p!=NULL)?p:q; //处理剩余节点
    return listc; //返回合并后的链表
}

题解

这段代码的功能是将两个非递减有序链表合并成一个非递减有序链表。下面我将逐步解释这段代码:

函数声明与初始化变量
LinkList mergeLists(LinkList lista, LinkList listb){
    LinkList listc, p = lista, q = listb, r;
  • LinkList mergeLists(LinkList lista, LinkList listb):函数名为mergeLists,参数是两个非递减有序链表listalistb,返回值是合并后的链表。
  • LinkList listc, p = lista, q = listb, r;:定义了四个指针变量:
    • listc:用于指向合并后的链表的头节点。
    • p:初始化为指向链表lista的当前节点。
    • q:初始化为指向链表listb的当前节点。
    • r:用于构建合并后的链表。
初始化合并链表的头节点
if(lista->data<=listb->data){
    listc=lista;
    r=lista;
    p=lista->next;
}
else{
    listc=listb;
    r=listb;
    q=listb->next;
}

if(lista->data<=listb->data):比较listalistb的头节点数据。

  • 如果lista的头节点数据小于等于listb的头节点数据:
    • listc = lista:将合并链表的头节点指向lista的头节点。
    • r = listar指向当前合并链表的最后一个节点(此时是lista的头节点)。
    • p = lista->next:将指针p移动到lista的下一个节点。
  • 否则:
    • listc = listb:将合并链表的头节点指向listb的头节点。
    • r = listbr指向当前合并链表的最后一个节点(此时是listb的头节点)。
    • q = listb->next:将指针q移动到listb的下一个节点。
合并两个链表
while(p!=NULL && q!=NULL){
    if(p->data<=q->data){
        r->next=p;
        r=p;
        p=p->next;
    }
    else{
        r->next=q;
        r=q;
        q=q->next;
    }
}

while(p!=NULL && q!=NULL):循环遍历listalistb,直到其中一个链表遍历完(pq变为NULL)。

  • if(p->data<=q->data):比较pq指向的节点数据。
    • 如果p的数据小于等于q的数据:
      • r->next=p:将当前合并链表的最后一个节点的next指针指向p
      • r=p:将r指向p,即更新当前合并链表的最后一个节点。
      • p=p->next:将指针p移动到lista的下一个节点。
    • 否则:
      • r->next=q:将当前合并链表的最后一个节点的next指针指向q
      • r=q:将r指向q,即更新当前合并链表的最后一个节点。
      • q=q->next:将指针q移动到listb的下一个节点。
处理剩余节点
r->next=(p!=NULL)?p:q;

r->next=(p!=NULL)?p:q;:当while循环结束时,可能还剩下一个链表中有未处理完的节点。

  • 如果p不为空,则将r->next指向p,即将剩余的lista节点连接到合并链表的末尾。
  • 如果p为空,则将r->next指向q,即将剩余的listb节点连接到合并链表的末尾。
返回合并后的链表
return listc;
  • return listc;:返回合并后的链表listc

总结:这段代码通过比较两个链表的节点数据,将较小的数据节点依次连接到合并后的链表中,最终返回一个合并后的非递减有序链表。

完整测试代码

#include<iostream>
using namespace std;

// 定义链表节点结构
struct Node {
int data;
Node* next;
};
// 定义 LinkList 类型为指向 Node 的指针
typedef Node* LinkList;
// 初始化链表
void InitList(LinkList& L){
    L=new Node;
    L->next=NULL;
}
// 合并两个非递减有序链表(得分点)
LinkList mergeLists(LinkList lista, LinkList listb){
    LinkList listc, p = lista, q = listb, r;
    //lilistc指向lista 和 listb所指结点中较小者
    if(lista->data<=listb->data){
        listc=lista;
        r=lista;
        p=lista->next;
    }
    else{
        listc=listb;
        r=listb;
        q=listb->next;
    }

    while(p!=NULL && q!=NULL){
        if(p->data<=q->data){
            r->next=p;
            r=p;
            p=p->next;
        }
        else{
            r->next=q;
            r=q;
            q=q->next;
        }
    }
    r->next=(p!=NULL)?p:q;
    return listc;
}
// 打印链表
void printList(LinkList head) {
    while (head != nullptr) {
        cout << head->data << " ";
        head = head->next;
    }
    cout << endl;
}

int main() {
    // 创建链表 a: 1 -> 3 -> 5
    Node* a1 = new Node{1, nullptr};
    Node* a2 = new Node{3, nullptr};
    Node* a3 = new Node{5, nullptr};
    a1->next = a2;
    a2->next = a3;

    // 创建链表 b: 2 -> 4 -> 6
    Node* b1 = new Node{2, nullptr};
    Node* b2 = new Node{4, nullptr};
    Node* b3 = new Node{6, nullptr};
    b1->next = b2;
    b2->next = b3;

    // 合并链表
    LinkList mergedList = mergeLists(a1, b1);

    // 打印结果
    printList(mergedList); // 应该输出: 1 2 3 4 5 6

    // 清理内存
    while (mergedList != nullptr) {
        Node* temp = mergedList;
        mergedList = mergedList->next;
        delete temp;
    }

    return 0;
}

嗨,我是命运之光。如果你觉得我的分享有价值,不妨通过以下方式表达你的支持:👍 点赞来表达你的喜爱,📁 关注以获取我的最新消息,💬 评论与我交流你的见解。我会继续努力,为你带来更多精彩和实用的内容。

点击这里👉 ,获取最新动态,⚡️ 让信息传递更加迅速。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1976693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何将文件转换成PDF(四种PDF虚拟打印机介绍)

Microsoft Print To PDF 这是Windows 10及以上系统自带的转换成PDF的工具 运行输入 optionalfeatures 打开可选功能&#xff0c;钩上 [Microsoft Print To PDF] 安装完成后&#xff0c;打开一个支持打印的文件类型或者网页&#xff0c;选择打印&#xff0c;在打印机界面可以看…

4.Redis数据结构通用命令

Redis数据结构 Redis是一个键值对的数据库。 key&#xff1a;大多都是String value: 类型多种多样 Redis通用命令 keys :查看所有的key 不建议在生产环境上使用keys命令&#xff0c;因为redis是单线程的&#xff0c;keys命令会搜索很长一段时间&#xff0c;搜索的期间redi…

[数据集][目标检测]金属罐缺陷检测数据集VOC+YOLO格式8095张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8095 标注数量(xml文件个数)&#xff1a;8095 标注数量(txt文件个数)&#xff1a;8095 标注…

Llama3.1技术报告简要解读--附PDF

以为前些天是在炒作llama3.1泄露&#xff0c;没想到Meta在24号凌晨直接开源了&#xff0c;包括三个不同参数规模的模型&#xff08;8B、70B、405B&#xff09;&#xff0c;三个模型上下文长度都是128K&#xff0c;其中超大杯拥有4050亿参数&#xff0c;从评测指标来看必是最强开…

基于MPC在线优化的有效集法位置控制器simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 模型预测控制是一种基于模型的优化控制方法&#xff0c;它利用过程模型预测未来行为&#xff0c;并通过求解一个优化问题来确定最优控制序列。MPC的特点在于它能够处理系统的动…

罗汉果糖基转移酶 SgUGT94-289-3--文献精读-37

Structural insights into the catalytic selectivity of glycosyltransferase SgUGT94-289-3 towards mogrosides 关于糖基转移酶 SgUGT94-289-3 对罗汉果苷催化选择性的结构洞察 摘要 罗汉果苷是一系列从罗汉果 (Siraitia grosvenorii) 中提取的天然甜味剂。这些罗汉果苷具…

PyQt5入门

Python中经常使用的GUI控件集有PyQt、Tkinter、wxPython、Kivy、PyGUI和Libavg。其中PyQt是Qt(c语言实现的)为Python专门提供的扩展 PyQt是一套Python的GUI开发框架,即图形用户界面开发框架.。而在Python中则使用PyQt这一工具包&#xff08;PyQt5、PyQt5-tools、PyQt5-stubs&am…

数学建模--支持向量机

目录 SVM的基本原理 SVM的应用场景 实现细节与案例分析 总结 支持向量机&#xff08;SVM&#xff09;在处理非线性数据时的核函数有哪些&#xff0c;以及它们各自的优缺点是什么&#xff1f; 如何选择支持向量机的惩罚参数CC以优化模型性能和计算效率&#xff1f; 在实际…

Day17_1--AJAX学习之GET/POST传参

AJAX 简介 AJAX 是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。其实AJAX就可以理解为就是JS。通过AJAX也就实现了前后端分离&#xff0c;前端只写页面&#xff0c;后端生成数据&#xff01; 现在开始通过实例学习&#xff1a; 1--GET传参 <!…

4.4 标准正交基和格拉姆-施密特正交化

本节的两个目标就是为什么和怎么做(why and how)。首先是知道为什么正交性很好&#xff1a;因为它们的点积为零&#xff1b; A T A A^TA ATA 是对角矩阵&#xff1b;在求 x ^ \boldsymbol{\hat x} x^ 和 p A x ^ \boldsymbol pA\boldsymbol{\hat x} pAx^ 时也会很简单。第二…

深入解析 kubectl describe pod:全面了解 Kubernetes Pod 的运行状态

引言 在 Kubernetes 集群中&#xff0c;kubectl describe pod 命令是运维人员和开发者常用的工具之一&#xff0c;它提供了有关 Pod 的详细信息&#xff0c;帮助我们了解 Pod 的状态、配置和运行状况。这篇博文将深入解析 kubectl describe pod 命令的输出内容&#xff0c;逐项…

Transformer网络的魔改结构与应用领域

Transformer网络的魔改结构与应用领域 Transformer的基础架构Transformer的变体Transformer的应用领域未来发展方向 参考文献 自从Transformer架构在2017年被提出以来&#xff0c;它已经成为深度学习领域的一项革命性技术。Transformer最初应用于自然语言处理&#xff08;NLP&a…

测试左移,浅谈如何编写可反复执行的单元测试用例

测试左移&#xff0c;浅谈如何编写可反复执行的单元测试用例 背景当下现状期望目标当下困境 解决问题问题1&#xff1a;事务提交Transactional代码示例 问题2&#xff1a;对数据库数据强依赖Sql代码示例SQL脚本示例 问题3&#xff1a;断言assert的使用代码示例DemoTestBaseAppl…

触想工业显示器方案在汽车装配生产线上的应用

一、行业发展背景 中国汽车工业协会数据显示&#xff0c;2023年我国汽车产销量双双实现历史性突破&#xff0c;分别达到3016.1万辆和3009.4万辆&#xff0c;并连续15年位居全球首位。 汽车产业热销背后是先进的生产装配体系支撑&#xff0c;从零部件到整车&#xff0c;汽车的生…

IntelliJ IDEA下载、安装、运行,示例代码;最详细安装和运行教程

IntelliJ IDEA下载、安装、运行&#xff0c;最详细安装教程 以下内容参考&#xff1a; 原文标题&#xff1a;IntelliJ IDEA下载安装教程&#xff08;非常详细&#xff09;从零基础入门到精通&#xff0c;看完这一篇就够了-CSDN博客 原文地址&#xff1a;https://blog.csdn.net/…

汇编语言代码中立即数的前缀和后缀

汇编语言的语法细节非常多&#xff1b; 1 以A-F开头的十六进制数前需要加0 在汇编语言代码中&#xff0c;‌以A-F开头的十六进制数前需要加0以避免被识别为助记符。‌ 如下图&#xff0c; MOV AL, AFH&#xff0c; 这样将报错&#xff1b; AFH的前面加0就对了&#xf…

基于STM32的智能医疗监控系统教程

目录 引言环境准备智能医疗监控系统基础代码实现&#xff1a;实现智能医疗监控系统 生理参数监测模块数据处理与存储模块无线通信模块用户界面与报警系统应用场景&#xff1a;医疗监测与优化常见问题与解决方案收尾与总结 引言 随着健康管理需求的增加&#xff0c;智能医疗监…

“消费新纪元:解锁消费增值的无限可能“

亲爱的顾客朋友们&#xff0c;大家好&#xff01;今天&#xff0c;我非常荣幸能与大家分享一种前沿的消费理念——“消费增值”&#xff0c;它旨在让您的每一次消费都充满额外的价值与回报&#xff01; 在传统消费观念里&#xff0c;我们往往只是简单地支付金钱以换取商品或服务…

IBM:生成式AI时代的网络安全研究报告

《生成式 AI 时代的网络安全》由 IBM 发布&#xff0c;该报告指出随着生成式 AI 在企业中的广泛应用&#xff0c;网络安全面临新的挑战与机遇。 一、简介 网络安全领导者在面对生成式 AI 带来的变革时&#xff0c;需应对其潜在风险。尽管生成式 AI 能大幅提高企业生产力&…

学python的第二天:第一个代码

打印一个“Hello World” print 中文含义“打印” PyCharm&#xff08;以后简称PC&#x1f641;&#xff09;的参数解释 它吧啦吧啦说个不停 但我只打印一个“Hello World” 代码&#xff1a; print("Hello World") 效果&#xff1a; 魔改时间到 一号选手 请…