【剑指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 ...
随机推荐
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- PHP 时间和日期 总结
PHP 时间戳 UNIX 时间戳(timestamp)是 PHP 中关于时间日期一个很重要的概念,它表示从 1970年1月1日 00:00:00 到当前时间的秒数之和. 可以使用time()函数来获取 ...
- 复制virtualenv环境到其他服务器环境配置的方法
要在n多服务器端部署python的应用,虽然python本身是跨平台的,当时好多第三方的扩展却不一定都能做到各个版本兼容,即便是都是linux,在redhat系列和ubuntu系列之间来回导也是个很让 ...
- 我的Python成长之路---第六天---Python基础(18)---2016年2月20日(晴)
os模块 提供对操作系统进行调用的接口 >>> import os >>> os.getcwd() # 获取当前工作目录,类似linux的pwd命令 '/data/ ...
- Spark1.5.1的安装与部署 每一步详细测试截图
转载或借鉴请注明转自 http://www.cnblogs.com/FG123/p/5101733.html 谢谢! 1.安装Spark之前需要先安装Java,Scala及Python(个人喜欢用p ...
- 资源文件(.RES)的应用
资源档有什麽用处呢?最重要的有两个地方1.国际发行:我们将Application中所有的文字从Resource用读取,那麽,只要更动 Resource档的内容,就可以用不同语言的 ...
- 用typedef声明类型
定义: 可以用typedef声明一个新的类型名来代替已有的类型名. 用法: typedef int INTEGER;//指定用标识符INTEGER代表int类型 typedef float REAL; ...
- Jquery 实现动态加入table tr 和删除tr 以及checkbox的全选 和 获取加入TR删除TR后的数据
关于jquery实现动态加入table tr的问题我也不多说了 上面代码非常多地方都有凝视的 关于返回的 编辑后的table 数据 我这里想说的是我直接把他保存成一个连接起来的字符串了 格式 str= ...
- 【JavaScript】history.back() 网页已过期
使用history.back()进行返回时,有时会提示“网页已过期”, 多数是因为目标页面的form为post提交方式,而且是表单已经提交后的响应页面,无法找到form中的具体参数,而“报错”. 具体 ...
- ubuntu15.04更新软件源
1,首先备份原来的源 sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup2,编辑软件源的文件 sudo vim /etc/apt/so ...