题目描述

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

思路分析

  1. 非递归,设置一个头结点,比较两个链表中的值,通过头结点将其串联起来,最后返回的是头结点的next
  2. 递归方法。

测试用例

  1. 功能测试:输入的两个链表有多个节点;节点的值互不相同或者存
    在值相等的多个节点
  2. 特殊输入测试:两个链表的一个或者两个头节点为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代码-Java

【Offer】[25] 【合并两个排序的链表】的更多相关文章

  1. 剑指 Offer 25. 合并两个排序的链表

    剑指 Offer 25. 合并两个排序的链表 Offer 25 该问题的原型就是多项式的合并. 实现较简单,没有特殊需要注意的问题. package com.walegarrett.offer; /* ...

  2. [剑指offer]25.合并两个排序的链表(迭代+递归)

    25.合并两个排序的链表 题目 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: 输入:1->2->4, 1->3->4 输出:1-> ...

  3. 【Java】 剑指offer(25) 合并两个排序的链表

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照 ...

  4. 【力扣】剑指 Offer 25. 合并两个排序的链表

    输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: 输入:1->2->4, 1->3->4输出:1->1->2->3-> ...

  5. 剑指offer——25合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.   题解: 使用普通方法,或者递归,注意新的头节点即可. //使用普通的合并方法 class S ...

  6. 剑指Offer:合并两个排序的链表【25】

    剑指Offer:合并两个排序的链表[25] 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 每次都是比较箭头节点,把小节点连接到已经合 ...

  7. 【剑指offer】面试题 25. 合并两个排序的链表

    面试题 25. 合并两个排序的链表 NowCoder 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. Java 实现 ListNode Clas ...

  8. 《剑指offer》 合并两个排序的链表

    本题来自<剑指offer> 合并两个排序的链表 题目: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路: A:采用递归的方式(C++ C ...

  9. 【剑指Offer】合并两个排序的链表 解题报告(Python)

    [剑指Offer]合并两个排序的链表 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interview ...

  10. 《剑指offer》面试题25. 合并两个排序的链表

    问题描述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: 输入:1->2->4, 1->3->4 输出:1->1->2-> ...

随机推荐

  1. Vue+Typescript中在Vue上挂载axios使用时报错

    Vue+Typescript中在Vue上挂载axios使用时报错 在vue项目开发过程中,为了方便在各个组件中调用axios,我们通常会在入口文件将axios挂载到vue原型身上,如下: main.t ...

  2. 0x02 递推与递归

    [例题]CH0301 递归实现指数型枚举 #include <iostream> #include <cstdio> #include <algorithm> #i ...

  3. 【简洁易懂】CF372C Watching Fireworks is Fun dp + 单调队列优化 dp优化 ACM codeforces

    题目大意 一条街道有$n$个区域. 从左到右编号为$1$到$n$. 相邻区域之间的距离为$1$. 在节日期间,有$m$次烟花要燃放. 第$i$次烟花燃放区域为$a_i$ ,幸福属性为$b_i$,时间为 ...

  4. Netty学习(九)-Netty编解码技术之Marshalling

    前面我们讲过protobuf的使用,主流的编解码框架其实还有很多种: ①JBoss的Marshalling包 ②google的Protobuf ③基于Protobuf的Kyro ④Apache的Thr ...

  5. 天气预报APP(2)

    之前实现了能够罗列可以罗列出全国所有的省.市.县,然后就是查询全国任意城市的天气信息.查询天气信息使用的是和风天气的api,这个api获得的天气信息是JSON格式的. 使用GSON库解析JSON数据的 ...

  6. C# 发送邮件 并自定义邮件格式

    话不多说,直接上代码 //邮件提醒 string Body = @"Dear " + list.Rows[i]["people"] + ":<b ...

  7. MTFlexbox自动化埋点探索

    1. 背景 跨平台动态化技术是目前移动互联网领域的重点关注方向,它既能节约人力,又能实现业务快速上线的需求.经过十年的发展,美团App已经变成了一个承载众多业务的超级平台,众多的业务方对业务形态的快速 ...

  8. 【原创】display:flex布局大全

    全都是自己写的 希望大家可以点个赞 谢谢! Html代码(没时间精简 请多包涵) <!DOCTYPE html> <html lang="en"> < ...

  9. 熔断器Hystrix

    什么是服务雪崩? 单个服务发生故障,占用过多的系统资源,从而导致级联故障的情况称为服务雪崩. 什么是Hystrix? 在分布式环境中,许多服务依赖项中的一些必然会失败.(服务挂了) Hystrix是一 ...

  10. docker安装到基本使用

    记录docker概念,安装及入门日常使用 Docker安装(Linux / Debian) 查看官方文档,在Debian上安装Docker,其他平台在这里查阅,以下均在root用户下操作,省去sudo ...