剑指offer——JZ25 合并两个排序的链表 解题思路与具体代码【C++】

2023-10-04 18:15

本文主要是介绍剑指offer——JZ25 合并两个排序的链表 解题思路与具体代码【C++】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目描述与要求

合并两个排序的链表_牛客题霸_牛客网 (nowcoder.com)

题目描述

输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。

数据范围: 0≤n≤1000,−1000≤节点值≤1000
要求:空间复杂度 O(1),时间复杂度 O(n)

如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:

或输入{-1,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4},转换过程如下图所示:

示例

示例1:

输入:{1,3,5},{2,4,6}

返回值:{1,2,3,4,5,6}

示例2:

输入:{},{}

返回值:{}

示例3:

输入:{-1,2,4},{1,3,4}

返回值:{-1,1,2,3,4,4}


二、解题思路

首先我们需要对两个表进行判断。一旦有一个表为空,则直接返回另一个表的头结点即可,如果两个链表都为空,则返回NULL。

然后就是两个表都不为空的情况下如何去合并两个表,我们可以定义三个辅助指针pa、pb、pc,分别用于遍历需要合并的两个链表还有合并成的第三个链表,还有定义一个头结点pHead3,同于最后返回结果。接着分别判断两个表的第一个结点,取小的一方作为合并后的头结点,也就是pHead3所要指向的结点。

然后就是对两个表同时进行遍历,然后判断当前pa和pb所指向的结点的值的大小,小者使pc指向它(合并),然后指针后移遍历下一个结点,一直到有一个表为空或者两个表都为空的情况则结束。

当有一个表为空时,则只需要将剩下的那个表的结点以尾插法插入C中即可,可以用while,也可以利用条件表达式(更为简便)


三、具体代码

class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param pHead1 ListNode类 * @param pHead2 ListNode类 * @return ListNode类*/ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {// write code hereif(pHead1==NULL&&pHead2!=NULL){ //如果表1为空 表2不为空则直接返回表2return pHead2;}else if(pHead1!=NULL&&pHead2==NULL){ //如果表2为空 表1不为空则直接返回表1return pHead1;}else if(pHead1==NULL&&pHead2==NULL){ //两个表都为空返回NULreturn NULL;}else{ListNode *pa,*pb,*pc,*q,*pHead3;pa=pHead1;pb=pHead2;if(pa->val<=pb->val){pc=pa;pHead3=pc;pa=pa->next;}else{pc=pb;pHead3=pc;pb=pb->next;}while(pa&&pb){ //两表都不为空if(pa->val<=pb->val){pc->next=pa;pc=pa;pa=pa->next;}else{pc->next=pb;pc=pb;pb=pb->next;}}// while(pa){ //表1不为空//     q=pa->next;//     pa->next=NULL;//     pc->next=pa;//     pc=pa;//     pa=q;// }// while(pb){//     q=pb->next;//     pb->next=NULL;//     pc->next=pb;//     pc=pb;//     pb=q;// }pc->next=pa?pa:pb;return pHead3;}}
};

这篇关于剑指offer——JZ25 合并两个排序的链表 解题思路与具体代码【C++】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/2513

相关文章

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多