【剑指Offer学习】【面试题17 ::合并两个排序的链表】
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是依照递增排序的
链表结点定义例如以下:
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 ::合并两个排序的链表】的更多相关文章
- 《剑指offer》面试题17 合并两个排序的链表 Java版
我的方法:新初始化一个链表头,比较两个链表当前节点的大小,然后连接到该链表中.遍历两个链表直到null为止. public ListNode merge(ListNode first, ListNod ...
- 【剑指offer】面试题 25. 合并两个排序的链表
面试题 25. 合并两个排序的链表 NowCoder 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. Java 实现 ListNode Clas ...
- 《剑指offer》面试题25. 合并两个排序的链表
问题描述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: 输入:1->2->4, 1->3->4 输出:1->1->2-> ...
- 《剑指offer》面试题17—合并两个排序链表
题目:输入两个递增排顺序的链表,合并这两个链表并使合并后的链表仍是递增排序的. 重点: 1.代码鲁棒性:要判断输入的两个链表都为NULL:其中一个链表为NULL的情况. 2.用递归实现,注意递归的思路 ...
- 剑指offer-面试题17.合并两个排序的链表
题目:输入两个递增的排序的链表,合并这两个链表并使新链表中的节点仍然是 按照递增排序的.例如链表1链表2合并为链表3. List1:->->-> List2:->->-& ...
- 剑指Offer:面试题17——合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路1: 分别用p1,p2两个指针扫描两个有序链表,p3指针去构建新链表h3. p1.val & ...
- 剑指Offer(书):合并两个排序的列表
题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 递归版本: public ListNode Merge(ListNode list1,ListNod ...
- (剑指Offer)面试题17:合并两个排序的链表
题目: 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然时按照递增排序的. 链表结点定义如下: struct ListNode{ int val; ListNode* next; }; 思 ...
- 【剑指offer】面试题 17. 打印从 1 到最大的 n 位数
面试题 17. 打印从 1 到最大的 n 位数 题目描述 题目:输入数字 n,按顺序打印出从 1 最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数即 999. 解答过 ...
- 【剑指offer】面试题 9. 用两个栈实现队列
面试题 9. 用两个栈实现队列 题目描述 题目:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解答过程 import java.util.Stack; publ ...
随机推荐
- java volatile关键字的理解
转载:http://shmilyaw-hotmail-com.iteye.com/blog/1672779 一个多线程的示例引发的问题 在讨论这个关键字之前先看一个多线程的示例代码: public c ...
- Software Version --hdu1976
#include using namespace std; int main() { int T; cin>>T; int a1,b1,c1; int a2,b2,c2; while(T- ...
- 杭电ACM 偶数求和
偶数求和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- php随笔9-thinkphp OA系统 集成UEditor
版本信息:thinkphp 3.1.3 full UEditor 1.4.3.1 utf8-php 1.将EUditor放在项目public目录下. 2.在指定页面加载编辑器 <!-- ...
- 运行PHP
/usr/local/php/bin/php /home/www/index.php
- Windows Phone 8初学者开发—第3部分:编写第一个Windows Phone 8应用程序
原文 Windows Phone 8初学者开发—第3部分:编写第一个Windows Phone 8应用程序 原文地址: http://channel9.msdn.com/Series/Windows- ...
- Embedded Linux Primer----嵌入式Linux基础教程--2.4节--嵌入式Linux发行版
嵌入式Linux发行版 究竟什么是Linux发行版?在Linux内核引导之后,它期望找到并挂载根文件系统.当一个匹配的根文件系统已经挂载上,启动脚本开始运行大量程序和系统要求的工具.这些程序经常调用其 ...
- unix ls命令
[语法]: ls [-RadCxmlnogrtucpFbqisf1] [文件夹或文件......] [说明]: ls 命令列出指定文件夹下的文件,缺省文件夹为当前文件夹 ./,缺省输出顺序为纵向 ...
- c# datagridviewcomboboxcell值无效的解决办法
一直认为是数据库存储的数据和datagridviewcomboboxcell对不上导致,今天碰到两者对应上了,预览的时候还是提示错误, 查看了下网上其他大神的解决方法,是数据库字段类型有误,查看了下, ...
- light oj 1047-neighbor house
ime Limit:500MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Description The people ...