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

【LeetCode_21】合并两个有序链表

刷爆LeetCode系列

  • LeetCode第21题:
  • github地址
  • 前言
  • 题目描述
  • 题目与思路分析
  • 代码实现
  • 算法代码优化

LeetCode第21题:

github地址

有梦想的电信狗

前言

  • 本文用C++解答LeetCode21

题目描述

题目链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/description/
在这里插入图片描述
在这里插入图片描述


题目与思路分析

目标分析

  1. 两个升序链表合并为一个升序链表
  2. 返回新链表的头指针
  3. 新链表中的结点由已有两链表中的节点组成
  4. 提高要求:时间复杂度为O(n),空间复杂度为O(1)

思路:创建一个新的空链表newHead同时逐个遍历两个链表的结点,将val较小的节点尾插到新链表中

操作

  • 注意对空链表的处理,两个链表可能都为空,也可能任意一个为空

  • 遍历:循环继续的条件为curNode1 && curNode2,只要有一个链表结束,结束即可,将未遍历完的链表直接整体尾插到新链表中

    • curNode1curNode2:分别用于遍历链表一和链表二
    • tailNode:尾结点,方便尾插时找尾
  • curNode->val <= curNode2->val时,说明:curNode1需要被尾插到新链表

    • 第一次尾插时(if(newHead == nullptr)需要特殊处理
      • tailNode = newHead = curNode;
      • curNode = curNode->next;
    • 其余结点的尾插,常规化处理
      • tailNode->next = curNode1;
      • tailNode = tailNode->next;
    • 插入完后:curNode = curNode->next;
  • curNode->val > curNode2->val时和上面是一样的逻辑

  • 循环结束后,检查哪个链表未遍历完全直接整体尾插到新链表中

    •    // 循环结束后,可能链表还有剩余元素if(curNode1)tailNode->next = curNode1;if(curNode2)tailNode->next = curNode2;
      
  • 最终返回return newHead;

在这里插入图片描述

代码实现

class Solution {
public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {// 空链表判断if(list1 == nullptr && list2 == nullptr)return nullptr;if(list1 == nullptr || list2 == nullptr){if(list1)return list1;if(list2)return list2;}// 以下 两个链表都不为空ListNode* curNode1 = list1;ListNode* curNode2 = list2;ListNode* newHead = nullptr, *tailNode = nullptr;while(curNode1 && curNode2){// 更小的元素尾插到新结点if(curNode1->val <= curNode2->val){// 第一个节点直接尾插if(newHead == nullptr){newHead = tailNode = curNode1;}// 其他节点直接 尾插else{tailNode->next = curNode1;tailNode = tailNode->next;}curNode1 = curNode1->next;}else{// 第一个节点直接尾插if(newHead == nullptr){newHead = curNode2;tailNode = curNode2;}// 其他节点直接 尾插else{tailNode->next = curNode2;tailNode = tailNode->next;}curNode2 = curNode2->next;}}// 循环结束后,可能链表还有剩余元素if(curNode1)tailNode->next = curNode1;if(curNode2)tailNode->next = curNode2;return newHead;}
};

算法代码优化

  • 优化了空链表返回的逻辑
  • 其中一个链表为空,就返回另一个链表
class Solution {
public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {if(list1 == nullptr)return list2;if(list2 == nullptr)return list1;// 以下 两个链表都不为空ListNode* curNode1 = list1;ListNode* curNode2 = list2;ListNode* newHead = nullptr, *tailNode = nullptr;while(curNode1 && curNode2){// 更小的元素尾插到新结点if(curNode1->val <= curNode2->val){// 第一个节点直接尾插if(newHead == nullptr){newHead = tailNode = curNode1;}// 其他节点直接 尾插else{tailNode->next = curNode1;tailNode = tailNode->next;}curNode1 = curNode1->next;}else{// 第一个节点直接尾插if(newHead == nullptr){newHead = curNode2;tailNode = curNode2;}// 其他节点直接 尾插else{tailNode->next = curNode2;tailNode = tailNode->next;}curNode2 = curNode2->next;}}// 循环结束后,可能链表还有剩余元素if(curNode1)tailNode->next = curNode1;if(curNode2)tailNode->next = curNode2;return newHead;}
};

以上就是本文的所有内容了,如果觉得文章对你有帮助,欢迎 点赞⭐收藏 支持!如有疑问或建议,请在评论区留言交流,我们一起进步

分享到此结束啦
一键三连,好运连连!

你的每一次互动,都是对作者最大的鼓励!


征程尚未结束,让我们在广阔的世界里继续前行! 🚀

http://www.dtcms.com/a/407632.html

相关文章:

  • 大庆建设工程交易中心网站提供网站建设管理
  • VSCode编译器测试yolo环境配置
  • 网站建设类国外企业招聘网站
  • tp做网站房地产培训网站建设
  • php网站做分享到朋友圈网站设置搜索框是什么知识点
  • 免费psd图片素材网站ui设计培训大概多少钱
  • 《C++程序设计》笔记p6
  • 安徽同济建设集团网站公司搭建网站模板
  • 【读书笔记】《大国大成》
  • C++笔记(基础)引用 inline内联函数
  • 焦作网站建设公司哪家好dz整站网站建设
  • 建站快车品牌北京网站建设兴田德润放心
  • cuda编程笔记(22)-- NVIDIA Triton Inference Server
  • 怎么知道网站是否被百度收录软件开发工具有哪些
  • 伦理治理进入程序化攻坚阶段
  • 经典网站赏析永久使用免费虚拟主机
  • 【跟我学YOLO】YOLO26:YOLO Vision 2025 最新发布的端到端视觉 AI 新突破
  • 什么网站百度收录好最新国家大事时政新闻
  • 怎么做网站手机版辅助设计软件有哪些
  • Model Context Protocol (MCP)详解与Spring Boot集成实战
  • 珠海h5模板建站网站建设考试卷a卷
  • 豆包Seedream 4.0创意玩法大赏:开启AI绘画新纪元
  • 算法基础篇(5)前缀和
  • 手机网站宽度多少合适网站开发行业代码
  • 了解一下Ubuntu上搭建的ROS环境
  • 博客网站搭建网站建设需要资质么
  • 泰安市景区建设网站阿里巴巴企业网站怎么做
  • 网站采用什么字体wordpress get_pages()
  • 禁用内核模块,是否需要执行脚本 $ sudo update-initramfs -u $ sudo update-grub ?
  • 建站最好的公司排名织梦cms源码