Java——合并两个排序的链表

news/2024/12/22 20:31:26/

题目链接

牛客在线oj题——合并两个排序的链表

题目描述

输入两个递增的链表,单个链表的长度为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}

解题思路一

构造一个新的head和end指针,第一次比较list1的val和list2的val,如果list1的val小于list2的值,head和end等于list1节点,list1 = list1.next
否则head和end等于list2节点,list2 = list2.next

接下来继续遍历,如果list1的val小于list2的值,end.next = list1,end = end.next, list1 = list1.next
否则head和end等于list2节点,end.next = list2,end = end.next, list2 = list2.next

如果list1或者list2遍历到空了,那么就让end.next = 没空的那个链表

例如:
在这里插入图片描述

此时list1.val < list2.val,head 和 end等于list1, list1 = list1.next
在这里插入图片描述
继续比较,list2.val < list1.val, 则end.next = list2, end = end.next, list2 = list2.next
在这里插入图片描述
继续上述操作,直到list1或list2中有一个为空
在这里插入图片描述
此时list1 == null 直接让end.next = list2
在这里插入图片描述
最终就可以形成排序后的链表

思路一完整代码

/*
public class ListNode {int val;ListNode next = null;ListNode(int val) {this.val = val;}
}*/
public class Solution {public ListNode Merge(ListNode list1,ListNode list2) {if(list1 == null){return list2;}if(list2 == null){return list1;}ListNode head = null;ListNode end = head;while(list1 != null && list2 != null){if(list1.val < list2.val){if(head == null){head = list1;end = head;} else {end.next = list1;end = end.next;}list1 = list1.next;} else {if(head == null){head = list2;end = head;} else {end.next = list2;   end = end.next;}list2 = list2.next;}}if(list1 == null){end.next = list2;} else {end.next = list1;}return head;}
}

解题思路二

因为Merge返回一个排序后的链表头节点,可以使用递归的方式来解决这个问题

定义一个head头节点,如果list1.val > list2.val, 那么就让head = list2, list2 = list2.next
否则head = list1, list1 = list1.next

最后递归head = Merge(list1, list2);就可以得到一个排序后的链表

而递归的出口就是当list1 == null,则直接返回list2, 当list2 == null, 直接返回ist1

思路二完整代码

/*
public class ListNode {int val;ListNode next = null;ListNode(int val) {this.val = val;}
}*/
public class Solution {public ListNode Merge(ListNode list1,ListNode list2) {//递归出口if(list1 == null){return list2;}if(list2 == null){return list1;}ListNode head = null;if(list1.val > list2.val){head = list2;list2 = list2.next;} else {head = list1;list1 = list1.next;}head.next = Merge(list1, list2);return head;}
}

http://www.ppmy.cn/news/46769.html

相关文章

ES X-Pack密码认证与用户管理

用户数据的安全性一直被人诟病且默认没有密码认证&#xff0c;Elasticsearch在6.8之前官方的X-pack安全认证功能都是收费的&#xff0c;所以很多人都采用Search Guard或者ReadOnly REST这些免费的安全插件对Elasticsearch进行安全认证。从Elasticsearch 6.8开始&#xff0c;Sec…

亚马逊的四大流量来自哪里?

一、排行榜流量 在Amazon中&#xff0c;影响排行榜流量的主要因素一般有这几种&#xff1a; 销售排行榜&#xff1a;这个排行榜是与销售和好评挂钩&#xff0c;不仅要销量好&#xff0c;好评也要多&#xff0c;所以要尽量让买家留下好的评价&#xff0c;这对排名的提升帮助很…

docker命令

1.运行 docker-compose up 2.查看命令 docker images 3.删掉docker镜像: docker rmi -f [id] docker卸载 1.杀死docker有关的容器&#xff1a; docker kill $(docker ps -a -q) 2.删除所有docker容器&#xff1a;docker rm $(docker ps -a -q) 3.删除所有docker镜像&…

车企外卷:一个关于智能手机的“围城故事”

从2016年达到顶峰开始&#xff0c;全球智能手机出货量逐年下行&#xff0c;手机市场进入红海竞争逐渐成为了各界的共识。此后全球疫情与经济疲软的影响也进一步在手机市场施压&#xff0c;很多媒体认为手机产业距离“至暗时刻”已经不远。 而在去年&#xff0c;新增变数&#x…

《剪花布条》:从花布条中尽可能剪出几块小饰条

目录 一、题目 二、思路 1、代码中要使用的String类中的方法 &#xff08;1&#xff09;判断 s 中是否有 t &#xff08;2&#xff09;将 s 分割 2、递归判断 三、代码 详细注释版本 简化注释版本 一、题目 题目&#xff1a;剪花布条 题目链接&#xf…

【学习笔记】ARC159

D - LIS 2 因为没有让你求方案数&#xff0c;所以还是比较好做的。 如果每一个连续段都退化成一个点&#xff0c;那么答案就是直接求 L I S LIS LIS。 否则&#xff0c;假设我们选了一些连续段把它们拼起来形成答案&#xff0c;显然我们有 r i 1 ≥ l i r_{i1}\ge l_i ri1​…

数值区间的模糊匹配,二分查找的应用

先看图: 需求很明确,要根据左边的值,显示右边的值。 比如,现在拿到的值是 17.12,那么应该显示成 15;拿到 17.599 ,那么应该显示成 20. 先找规律: 为了便于说明,暂且将左边的值设为 x, 右边的值设为 y. 第一行和最后一行可以写死成 0 与 1500;余下的每行,x 的区间是…

excel中补齐IP,使得每一段为三位

有一个EXCEL中有IP信息。为10.198.37.183,需要补齐为010.198.037.183;10.68.80.74补齐为010.068.080.074 网上搜了的补齐IP的函数为 TEXT(LEFT(D36,FIND(“.”,D36)-1),“000.”)&TEXT(MID(D36,FIND(“.”,D36)+1,FIND(““,SUBSTITUTE(D36,”.“,””,2))-FIND(“.”,D3…