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

LeetCode 面试经典 150_链表_合并两个有序链表(58_21_C++_简单)

LeetCode 面试经典 150_链表_合并两个有序链表(58_21_C++_简单)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(迭代):
      • 代码实现
        • 代码实现(思路一(迭代)):
        • 以思路一为例完成代码调试

题目描述:

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

输入输出样例:

示例 1:
请添加图片描述

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:
输入:l1 = [], l2 = []
输出:[]

示例 3:
输入:l1 = [], l2 = [0]
输出:[0]

提示:

两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列

题解:

解题思路:

思路一(迭代):

1、通过题目分析,将两个升序链表合并为一个新的 升序 链表并返回。我们可以将两个链表中较小的结点 插入到合并链表,直至两个链表结束。

2、具体思路如下:
① 创建一个临时结点当作连接两个链表的头结点。
② 每次将值较小的结点连接到合并链表,采用尾插法进行合并。

3、复杂度分析
① 时间复杂度:O(n+m),其中 n 和 m 分别为两个链表的长度。因为每次循环迭代中,list1 和 list2 只有一个元素会被放进合并链表中, 因此 while 循环的次数不会超过两个链表的长度之和。因此总的时间复杂度为 O(n+m)。
② 空间复杂度:O(1)。我们只需要常数的空间存放若干变量。

代码实现

代码实现(思路一(迭代)):
class Solution {
public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {//创建一个临时结点当作连接两个链表的头结点 ListNode *prehead=new ListNode(-1);//采用尾插法进行合并 ListNode *tail=prehead;//每次将值较小的结点连接到合并链表 while(list1!=nullptr&&list2!=nullptr){if(list1->val<list2->val){tail->next=list1;list1=list1->next;}else{tail->next=list2;list2=list2->next;}//每次都连接一个结点后,tail向后移动一次记录末尾 tail=tail->next;}//注意这里连接一个结点,就是连接一串结点(未连接部分本来就是链表) tail->next=(list1!=nullptr) ? list1 : list2;//注意合并的结点是从第二个结点开始 return prehead->next;}
};
以思路一为例完成代码调试
#include<iostream>
#include<vector>
using namespace std;struct ListNode{int val;ListNode *next;ListNode():val(0),next(nullptr){}ListNode(int x):val(x),next(nullptr){}ListNode(int x,ListNode *next):val(x),next(next){}
};//创建单链表
ListNode *createList(vector<int> arr){ListNode *head=nullptr,*tail=nullptr;for(const auto val:arr){ListNode* newNode=new ListNode(val);if(head==nullptr){head=newNode;tail=newNode;}else{tail->next=newNode;tail=newNode;}}return head;
}class Solution {
public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {//创建一个临时结点当作连接两个链表的头结点 ListNode *prehead=new ListNode(-1);//采用尾插法进行合并 ListNode *tail=prehead;//每次将值较小的结点连接到合并链表 while(list1!=nullptr&&list2!=nullptr){if(list1->val<list2->val){tail->next=list1;list1=list1->next;}else{tail->next=list2;list2=list2->next;}//每次都连接一个结点后,tail向后移动一次记录末尾 tail=tail->next;}//注意这里连接一个结点,就是连接一串结点(未连接部分本来就是链表) tail->next=(list1!=nullptr) ? list1 : list2;//注意合并的结点是从第二个结点开始 return prehead->next;}
};int main(){vector<int> a={1,2,4};vector<int> b={1,3,4};ListNode *list1=createList(a);ListNode *list2=createList(b);Solution s;ListNode *mergeList=s.mergeTwoLists(list1,list2);while(mergeList!=nullptr){cout<<mergeList->val<<"->";mergeList=mergeList->next;}cout<<"null";return 0;
} 

LeetCode 面试经典 150_链表_合并两个有序链表(58_21)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

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

相关文章:

  • [优选算法专题四.前缀和——NO.31~32 连续数组、矩阵区域和]
  • 事业单位网站备案流程谷歌做不做网站
  • 做家居网站企业建设网站的目标
  • 福田网站改版安徽六安特产
  • XML 核心知识点
  • 图片类网站模板自己做网站是用什么软件
  • 全国通用工会考试真题及答案解析
  • 东莞寮步镇网站做网站需要自己研发吗
  • QLExpress 解析方程式
  • AI编程:结合MCP实现数据库连接与高效开发
  • 在线做网站有哪些平台wordpress二级
  • 怎样制作自己公司的网站企业在建设自己网站时
  • Flink DatastreamAPI详解(二)
  • 丢盖网logo设计免费官网合肥网站建设优化
  • Android View, SurfaceView, GLSurfaceView 的区别
  • 数据结构---优先级队列(堆)
  • PHP反序列化漏洞
  • dw做的网站怎么发布到网上wordpress wamp
  • 信用门户网站建设方案网站建设空间申请
  • RAG性能提升:从查询优化到范式演进的系统性路径
  • 响应式网站开发方法游戏官网平台
  • 网络管理员教程(初级)第六版--第4章 Web网站建设
  • 网站导入链接创建
  • 企业网站最重要的访问对象是Vantage wordpress主题
  • SpringBoot-数据访问之Druid
  • 算法 vs 社区:Pump 与 FourMeme 的增长机制之战
  • 「PPG信号处理——(2)脉搏波信号刺激前后RMSSD心率变异性研究」2025年10月23日
  • 学网站开发可以创业吗学校网站英文
  • 哈尔滨企业自助建站php做的网站手机能看到
  • Ubuntu关于串口的操作