当前位置: 首页 > ds >正文

力扣题解:21.合并两个有序链表(C语言)

将两个升序链表合并为一个新的升序链表是一个经典的链表操作问题。可以通过递归或迭代的方法来解决。以下是解释和代码实现:

递归:

每次比较两个链表的头节点,将较小的节点添加到新链表中,并递归处理剩余部分。

  1. 截至条件

    • 如果 L1​ 为空,直接返回 L2​。

    • 如果 L2​ 为空,直接返回 L1​。

  2. 递归步骤

    • 比较 L1​ 和 L2​ 的头节点。

    • 将较小的节点作为新链表的头节点。

    • 递归处理较小节点的下一个节点和另一个链表的头节点。

(当某一个链表为空时,返回另一个链表的剩余部分链接到末尾。不需要像迭代法特殊处理)

代码:

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {// 如果 list1 为空,直接返回 list2if (list1 == NULL) {return list2;}// 如果 list2 为空,直接返回 list1if (list2 == NULL) {return list1;}// 比较 list1 和 list2 的当前节点值if (list1->val <= list2->val) {// 如果 list1 的当前节点值较小,则将 list1 的当前节点作为合并后链表的当前节点list1->next = mergeTwoLists(list1->next, list2); // 递归合并 list1 的剩余部分和 list2return list1; // 返回 list1 的当前节点作为合并后链表的头节点} else {// 如果 list2 的当前节点值较小,则将 list2 的当前节点作为合并后链表的当前节点list2->next = mergeTwoLists(list1, list2->next); // 递归合并 list1 和 list2 的剩余部分return list2; // 返回 list2 的当前节点作为合并后链表的头节点}
}

迭代:

迭代方法使用一个虚拟头节点(dummy node)作为新链表的头节点,通过一个指针逐步构建新链表。

  1. 初始化

    • 创建一个虚拟头节点 dummy,其 next 指针指向新链表的头节点。

    • 创建一个指针 current,初始指向 dummy。

  2. 迭代步骤

    • 比较 L1​ 和 L2​ 的头节点。

    • 将较小的节点连接到 current 的 next 指针。

    • 移动 current 指针到下一个节点。

    • 移动较小节点的链表指针到下一个节点。

  3. 处理剩余部分

    如果 L1​ 或 L2​ 中有一个链表已经遍历完,将另一个链表的剩余部分连接到新链表的末尾。

代码:

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)  {struct ListNode dummy;struct  ListNode* current = &dummy;
//当两个链表都不为空时,进行迭代while (list1 && list2) {
//将较小的结点链接到新链表中if (list1->val < list2->val) {current->next = list1;list1 = list1->next;} else {current->next = list2;list2 = list2->next;}current = current->next;}
//判断哪个链表为空,将不为空的链表剩余部分连接到新链表的尾端current->next = list1 ? list1 : list2;return dummy.next;
}

http://www.xdnf.cn/news/5008.html

相关文章:

  • 对遗传算法思想的理解与实例详解
  • Redis 主从复制集群搭建教程
  • 基于vue框架的电子商城m8qu8(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 构筑芯片行业的“安全硅甲”
  • SSL证书格式详解:PEM、CER、DER、JKS、PKCS12等
  • k8s之探针
  • 数据结构【二叉搜索树(BST)】
  • opencv中的图像特征提取
  • 解构C++高级命名空间:构建空间作用域·控制兼容
  • 【MySQL】第二弹——MySQL表的增删改查(CRUD)
  • 多态(c++详细版)
  • 大模型(LLMs)agent
  • 图像匹配导航定位技术 第 8 章
  • 编专利或委托他人编专利属于学术不端行为吗?
  • C++ 函数类型及实用例题
  • 前端如何处理精度丢失问题
  • 影响服务器性能的主要因素是什么
  • 量子通信技术及其在信息安全中的应用:开启无条件安全通信的新时代
  • 【Python】pyinstaller 反编译 exe
  • 手撕基于AMQP协议的简易消息队列-4(项目需求分析)
  • 现代健康养生新范式:多维度守护身心活力
  • TypeScript 中,属性修饰符
  • pytest自动化测试框架搭建,并生成allure测试报告
  • 【C语言干货】一维数组传参本质
  • 如何用LOTO示波器测量变压器带宽?
  • 一篇文章讲清楚mysql的聚簇索引、非聚簇索引、辅助索引
  • BGA底部填充胶固化异常延迟或不固化原因分析及解决方案
  • 垃圾回收的三色标记算法
  • <el-cascader中多选多层级点击节点也选中
  • Harmonyos-属性修改器和更新器