题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是依照递增排序的

链表结点定义例如以下:

public static class ListNode {
int value;
ListNode next;
}

解题思路:

见代码凝视

代码实现:

public class Test17 {
public static class ListNode {
int value;
ListNode next;
} /**
* 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是依照递增排序的
*
* @param head1 第一个有序链表
* @param head2 第二个有序链表
* @return 合并后的有序链表头
*/
public static ListNode merge(ListNode head1, ListNode head2) {
// 假设第一个链表为空,返回第二个链表头结点
if (head1 == null) {
return head2;
} // 假设第二个结点为空,返回第一个链表头结点
if (head2 == null) {
return head1;
} // 创建一个暂时结点。用于加入元素时方便
ListNode root = new ListNode();
// 用于指向合并后的新链的尾结点
ListNode pointer = root; // 当两个链表都不为空就进行合并操作
while (head1 != null && head2 != null) {
// 以下的操作合并较小的元素
if (head1.value < head2.value) {
pointer.next = head1;
head1 = head1.next;
} else {
pointer.next = head2;
head2 = head2.next;
} // 将指针移动到合并后的链表的末尾
pointer = pointer.next;
} // 以下的两个if有且仅仅一个if会内的内容会执行 // 假设第一个链表的元素未处理完将其,接到合并链表的最后一个结点之后
if (head1 != null) {
pointer.next = head1;
} // 假设第二个链表的元素未处理完将其,接到合并链表的最后一个结点之后
if (head2 != null) {
pointer.next = head2;
} // 返回处理结果
return root.next;
} /**
* 输入两个递增排序的链表。合并这两个链表并使新链表中的结点仍然是依照递增排序的
* 【使用的是递归的解法,不推荐,递归调用的时候会有方法入栈,须要很多其它的内存】
*
* @param head1 第一个有序链表
* @param head2 第二个有序链表
* @return 合并后的有序链表头
*/
public static ListNode merge2(ListNode head1, ListNode head2) {
// 假设第一个链表为空,返回第二个链表头结点
if (head1 == null) {
return head2;
} // 假设第二个链表为空。返回第一个链表头结点
if (head2 == null) {
return head1;
} // 记录两个链表中头部较小的结点
ListNode tmp = head1;
if (tmp.value < head2.value) {
// 假设第一个链表的头结点小,就递归处理第一个链表的下一个结点和第二个链表的头结点
tmp.next = merge2(head1.next, head2);
} else {
// 假设第二个链表的头结点小,就递归处理第一个链表的头结点和第二个链表的头结点的下一个结点
tmp = head2;
tmp.next = merge2(head1, head2.next);
} // 返回处理结果
return tmp;
} /**
* 输出链表的元素值
*
* @param head 链表的头结点
*/
public static void printList(ListNode head) {
while (head != null) {
System.out.print(head.value + "->");
head = head.next;
}
System.out.println("null");
} public static void main(String[] args) {
ListNode head = new ListNode();
head.value = 1; head.next = new ListNode();
head.next.value = 2; head.next.next = new ListNode();
head.next.next.value = 3; head.next.next.next = new ListNode();
head.next.next.next.value = 4; head.next.next.next.next = new ListNode();
head.next.next.next.next.value = 5; ListNode head2 = new ListNode();
head2.value = 1; head2.next = new ListNode();
head2.next.value = 3; head2.next.next = new ListNode();
head2.next.next.value = 5; head2.next.next.next = new ListNode();
head2.next.next.next.value = 6; head2.next.next.next.next = new ListNode();
head2.next.next.next.next.value = 7; // head = merge(head, head2);
head = merge2(head, head2);
printList(head);
}

执行结果:

【剑指Offer学习】【面试题17 ::合并两个排序的链表】的更多相关文章

  1. 《剑指offer》面试题17 合并两个排序的链表 Java版

    我的方法:新初始化一个链表头,比较两个链表当前节点的大小,然后连接到该链表中.遍历两个链表直到null为止. public ListNode merge(ListNode first, ListNod ...

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

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

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

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

  4. 《剑指offer》面试题17—合并两个排序链表

    题目:输入两个递增排顺序的链表,合并这两个链表并使合并后的链表仍是递增排序的. 重点: 1.代码鲁棒性:要判断输入的两个链表都为NULL:其中一个链表为NULL的情况. 2.用递归实现,注意递归的思路 ...

  5. 剑指offer-面试题17.合并两个排序的链表

    题目:输入两个递增的排序的链表,合并这两个链表并使新链表中的节点仍然是 按照递增排序的.例如链表1链表2合并为链表3. List1:->->-> List2:->->-& ...

  6. 剑指Offer:面试题17——合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路1: 分别用p1,p2两个指针扫描两个有序链表,p3指针去构建新链表h3. p1.val & ...

  7. 剑指Offer(书):合并两个排序的列表

    题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 递归版本: public ListNode Merge(ListNode list1,ListNod ...

  8. (剑指Offer)面试题17:合并两个排序的链表

    题目: 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然时按照递增排序的. 链表结点定义如下: struct ListNode{ int val; ListNode* next; }; 思 ...

  9. 【剑指offer】面试题 17. 打印从 1 到最大的 n 位数

    面试题 17. 打印从 1 到最大的 n 位数 题目描述 题目:输入数字 n,按顺序打印出从 1 最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数即 999. 解答过 ...

  10. 【剑指offer】面试题 9. 用两个栈实现队列

    面试题 9. 用两个栈实现队列 题目描述 题目:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解答过程 import java.util.Stack; publ ...

随机推荐

  1. Codeforces Round #316 (Div. 2C) 570C Replacement

    题目:Click here 题意:看一下题目下面的Note就会明白的. 分析:一开始想的麻烦了,用了树状数组(第一次用)优化,可惜没用. 直接判断: #include <bits/stdc++. ...

  2. js日历,使用datepicker.js,ui.core.js,jquery-1.7.1.js

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. poj 2965

    http://poj.org/problem?id=2965 本题要结合poj 1753 来看最好...又有了一点搜索的经验..加油... #include <iostream> #inc ...

  4. mysql-5.6.17-winx64 免安装 配置

    [client] default_character_set=utf8 port=3306 [mysql] # 设置mysql客户端默认字符集 default_character_set=utf8 [ ...

  5. windows phone:使用sqlite-net

    继上篇文章后,这里简单介绍下sqlite-net的使用(示例不为作者所写,摘自于:https://github.com/peterhuene/sqlite-net) Please consult th ...

  6. jsp验证表单后再提交

    在提交表单时,我们常常需要验证核实表单内容,若都不为空时,方能提交:若有文本框为空则不提交,并获取鼠标焦点到文本框上 ,所以我们可以利用onsubmit的方法来做,请看下面例子: <html&g ...

  7. UVA 10341 Solve It 解方程 二分查找+精度

    题意:给出一个式子以及里面的常量,求出范围为[0,1]的解,精度要求为小数点后4为. 二分暴力查找即可. e^(-n)可以用math.h里面的exp(-n)表示. 代码:(uva该题我老是出现Subm ...

  8. windows 下一个mysql password忘记改变

    到场mysql简介 my.ini 于[mysqld]以下被加入 skip-grant-tables win+R 热键 进cmd 然后输入命令net stop mysql  最后一点,使文件夹mysql ...

  9. setInterval定义与调用

    以下是一个倒计时,可以定义定时器为全局变量(ti2),或局部变量(ti). <script type="text/javascript" src="js/jquer ...

  10. 【Hibernate】HQL new map

    HQL 查询如果需要带出对象(比如:OneToOne子对象)的一两个属性,而不是全部带出.可以使用 select new map的方法带出. 1.lazy还是设置为false /**关联属性对象*/ ...