【Offer】[25] 【合并两个排序的链表】
题目描述
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。例如,输入图中的链表1和链表2,则合并之后的升序链表如链表3所示。链表节点定义如下:

思路分析
- 非递归,设置一个头结点,比较两个链表中的值,通过头结点将其串联起来,最后返回的是头结点的next
- 递归方法。
测试用例
- 功能测试:输入的两个链表有多个节点;节点的值互不相同或者存
在值相等的多个节点 - 特殊输入测试:两个链表的一个或者两个头节点为nullptr 指针;
两个链表中只有一个节点
Java代码
public class Offer25 {
public static void main(String[] args) {
test1();
test2();
test3();
test4();
}
public static ListNode Merge(ListNode l1, ListNode l2) {
return Solution3(l1, l2);
}
private static ListNode Solution1(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
}
if (l2 == null) {
return l1;
}
ListNode head = new ListNode(-1);
ListNode p = head;
while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
p.next = l1;
l1 = l1.next;
} else {
p.next = l2;
l2 = l2.next;
}
p = p.next;
if (l1 == null) {
p.next = l2;
} else {
p.next = l1;
}
}
return head.next;
}
private static ListNode Solution2(ListNode l1, ListNode l2) {
ListNode pHead = new ListNode(-1);
ListNode p = pHead;
while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
p.next = l1;
l1 = l1.next;
} else {
p.next = l2;
l2 = l2.next;
}
p = p.next;
}
if (l1 == null) {
p.next = l2;
} else {
p.next = l1;
}
return pHead.next;
}
/**
* 递归的方法
*
* @param l1
* @param l2
* @return
*/
private static ListNode Solution3(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
}
if (l2 == null) {
return l1;
}
if (l1.val <= l2.val) {
l1.next = Solution3(l1.next, l2);
return l1;
} else {
l2.next = Solution3(l1, l2.next);
return l2;
}
}
private static void test1() {
ListNode l1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(5);
ListNode node4 = new ListNode(7);
ListNode node5 = new ListNode(9);
ListNode node6 = new ListNode(11);
l1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
ListNode l2 = new ListNode(4);
ListNode node22 = new ListNode(6);
ListNode node23 = new ListNode(8);
ListNode node24 = new ListNode(13);
l2.next = node22;
node22.next = node23;
node23.next = node24;
System.out.println("链表1:");
ListNode.printListNode(l1);
System.out.println("链表2");
ListNode.printListNode(l2);
ListNode merge = Merge(l1, l2);
System.out.println("合并的链表--->");
ListNode.printListNode(merge);
}
private static void test2() {
ListNode l1 = new ListNode(1);
ListNode node2 = new ListNode(1);
ListNode node3 = new ListNode(1);
ListNode node4 = new ListNode(2);
ListNode node5 = new ListNode(4);
ListNode node6 = new ListNode(5);
l1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
ListNode l2 = new ListNode(1);
ListNode node22 = new ListNode(5);
ListNode node23 = new ListNode(5);
ListNode node24 = new ListNode(8);
l2.next = node22;
node22.next = node23;
node23.next = node24;
System.out.println("链表1:");
ListNode.printListNode(l1);
System.out.println("链表2");
ListNode.printListNode(l2);
ListNode merge = Merge(l1, l2);
System.out.println("合并的链表--->");
ListNode.printListNode(merge);
}
private static void test3() {
ListNode l1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(4);
ListNode node5 = new ListNode(7);
l1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
System.out.println("链表1:");
ListNode.printListNode(l1);
ListNode l2 = null;
System.out.println("链表2");
ListNode.printListNode(l2);
ListNode merge = Merge(l1, l2);
System.out.println("其中类l2为null,合并的链表--->");
ListNode.printListNode(merge);
}
private static void test4() {
System.out.println("都为null,合并链表--->");
ListNode merge = Merge(null, null);
ListNode.printListNode(merge);
}
}
代码链接
【Offer】[25] 【合并两个排序的链表】的更多相关文章
- 剑指 Offer 25. 合并两个排序的链表
剑指 Offer 25. 合并两个排序的链表 Offer 25 该问题的原型就是多项式的合并. 实现较简单,没有特殊需要注意的问题. package com.walegarrett.offer; /* ...
- [剑指offer]25.合并两个排序的链表(迭代+递归)
25.合并两个排序的链表 题目 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: 输入:1->2->4, 1->3->4 输出:1-> ...
- 【Java】 剑指offer(25) 合并两个排序的链表
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照 ...
- 【力扣】剑指 Offer 25. 合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: 输入:1->2->4, 1->3->4输出:1->1->2->3-> ...
- 剑指offer——25合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题解: 使用普通方法,或者递归,注意新的头节点即可. //使用普通的合并方法 class S ...
- 剑指Offer:合并两个排序的链表【25】
剑指Offer:合并两个排序的链表[25] 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 每次都是比较箭头节点,把小节点连接到已经合 ...
- 【剑指offer】面试题 25. 合并两个排序的链表
面试题 25. 合并两个排序的链表 NowCoder 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. Java 实现 ListNode Clas ...
- 《剑指offer》 合并两个排序的链表
本题来自<剑指offer> 合并两个排序的链表 题目: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路: A:采用递归的方式(C++ C ...
- 【剑指Offer】合并两个排序的链表 解题报告(Python)
[剑指Offer]合并两个排序的链表 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interview ...
- 《剑指offer》面试题25. 合并两个排序的链表
问题描述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: 输入:1->2->4, 1->3->4 输出:1->1->2-> ...
随机推荐
- java高并发系列 - 第22天:java中底层工具类Unsafe,高手必须要了解
这是java高并发系列第22篇文章,文章基于jdk1.8环境. 本文主要内容 基本介绍. 通过反射获取Unsafe实例 Unsafe中的CAS操作 Unsafe中原子操作相关方法介绍 Unsafe中线 ...
- GD32电压不足时烧写程序导致程序运行异常的解决方法
一直使用的GD32F450前段时间遇到这样一个问题,当使用J-Link供电给板子烧写程序之后,程序运行缓慢,就像运行在FLASH高速部分之外一样,但是如果使用外部供电烧写,就不会出现这个问题,而且一旦 ...
- 服务注册组件——Eureka高可用集群搭建
服务注册组件--Eureka高可用集群搭建 什么是Eureka? 服务注册组件:将微服务注册到Eureka中. 为什么需要服务注册? 微服务开发重点在一个"微"字,大型应用拆分成微 ...
- 云片RocketMQ实战:Stargate的前世今生
RocketMQ消息队列,专业消息中间件,既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积.高吞吐.可靠重试等特性,是应对企业业务峰值时刻必备的技术. 云片由于 ...
- 干货 | Elasticsearch、Kibana数据导出实战
1.问题引出 以下两个导出问题来自Elastic中文社区. 问题1.kibana怎么导出查询数据? 问题2:elasticsearch数据导出 就像数据库数据导出一样,elasticsearch可以么 ...
- 动图+源码,演示Java中常用数据结构执行过程及原理
最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...
- 重读《学习JavaScript数据结构与算法-第三版》- 第5章 队列
定场诗 马瘦毛长蹄子肥,儿子偷爹不算贼,瞎大爷娶个瞎大奶奶,老两口过了多半辈,谁也没看见谁! 前言 本章为重读<学习JavaScript数据结构与算法-第三版>的系列文章,主要讲述队列数据 ...
- 解决Mac下VSCode打开zsh乱码
1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码. iTerm2展示如下: VS ...
- .NET中的缓存
构建高性能的应用程序的非常重要一项就是使用缓存.使用缓存可以避免重新从读取服务器端读取数据,节省数据从客户端到服务器间往返的时间,同时也减轻了服务器数据存取的压力.如果客户端非常频繁地读取服务器上的数 ...
- python3.6.6在CentOS7上的安装
Python官网:https://www.python.org/ 下载指定版本的软件包: [root@General data]# yum clean all && yum rep ...