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

链表结点定义例如以下:

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. Android发送数据到web服务器4种方式

    1./** 2. * Android中向web服务器提交数据的两种方式四种方法 3. */ 4.public class SubmitDataByHttpClientAndOrdinaryWay { ...

  2. CGI PHP安装

    ./configure --with-php-config=/usr/local/php/bin/php-config--with-pdo-mysql=/usr/local/mysql PDO——MY ...

  3. FPGA知识大梳理(二)verilogHDL语法入门(1)

    此文是写给0基础学习者,也是对自己知识点总结水平的考验. 对于有C基础的人来说,学习verilog应该是轻而易举 —— 类比法学习. 第一步:格式. 对于C来说我们前面会写  ‘include“std ...

  4. Zookper

    http://blog.csdn.net/yangbutao/article/details/11669609 http://www.oschina.net/code/snippet_255033_2 ...

  5. mysql语句:批量更新多条记录的不同值

    mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 1 UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_va ...

  6. 免费利用网页版谷歌翻译实现任意语言转换php版

    本文源发布地址: http://ourgarden.cn/2013/07/20/%E5%85%8D%E8%B4%B9%E5%88%A9%E7%94%A8%E7%BD%91%E9%A1%B5%E7%89 ...

  7. Ajax学习(三)——XMLHttpRequest对象的五步使使用方法

        Ajax的核心技术是XMLHttpRequest对象,它能够在不向server提交整个页面的情况下.实现局部更新网页.通过这个对象,Ajax能够像桌面应用程序那样仅仅与server进行数据层的 ...

  8. Linux chmod命令具体解释

    仅仅能文件属主或特权用户才干使用该功能来改变文件存取模式.mode能够是数字形式或以who opcode permission形式表示. who是可选的,默认是a(全部用户). 仅仅能选择一个opco ...

  9. 关于闹钟设置AlarmManager类方法参数解释

    1.AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,可以实现从指定时间开始,以一个固定的间隔时间执行某项操作,所以常常与广播(Broadcast)连用 ...

  10. Fundamental types

    Fundamental types void type boolean type character types integer types Modifiers signedness size Pro ...