剑指offer面试题17:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点人是按照递增排序的。
解题思路:两个链表分别都已经是有序的了,遍历链表的时候只要比较两个链表当前位置大小,取出最小的添加到新链表中。
可以有递归、循环两种方式来解决。
package Solution;
public class No17MergeSortedLists {
public static class ListNode {
int data;
ListNode next;
public ListNode() {
}
public ListNode(int value, ListNode next) {
this.data = value;
this.next = next;
}
}
public static void print(ListNode head) {
if (head == null)
System.out.println("当前链表为空");
while (head != null) {
System.out.print(head.data + ",");
head = head.next;
}
System.out.println();
}
//递归方式合并两个排序的链表
public static ListNode merge(ListNode head1, ListNode head2) {
if (head1 == null)
return head2;
if (head2 == null)
return head1;
ListNode mergedHead = null;
if (head1.data < head2.data) {
mergedHead = head1;
mergedHead.next = merge(head1.next, head2);
} else {
// 如果两个节点的值相同,返回第二个
mergedHead = head2;
mergedHead.next = merge(head1, head2.next);
}
return mergedHead;
}
//依次比较两个链表的当前结点,添加到新链表中
public static ListNode mergeSortedList(ListNode head1, ListNode head2) {
if (head1 == null)
return head2;
if (head2 == null) {
return head1;
}
ListNode newHead = null;
ListNode newNode = null;
ListNode list1 = head1;
ListNode list2 = head2;
// 找到新的头结点
if (list1.data < list2.data) {
newHead = list1;
list1 = list1.next;
} else {
newHead = list2;
list2 = list2.next;
}
newNode = newHead;
// 合并其他节点
while (list1 != null && list2 != null) {
if (list1.data < list2.data) {
newNode.next = list1;
list1 = list1.next;
} else {
newNode.next = list2;
list2 = list2.next;
}
newNode = newNode.next;
}
// 有一条链表合并完,则把剩下的另一条链表直接合并到新链条末尾
if (list1 == null) {
newNode.next = list2;
} else {
newNode.next = list1;
}
return newHead;
}
public static void main(String[] args) {
ListNode node1 = new ListNode(7, null);
ListNode node2 = new ListNode(4, node1);
ListNode node3 = new ListNode(3, node2);
ListNode head1 = new ListNode(1, node3);
ListNode node5 = new ListNode(8, null);
ListNode node6 = new ListNode(6, node5);
ListNode node7 = new ListNode(4, node6);
ListNode head2 = new ListNode(2, node7);
// 测试含有相同值得两个对各节点的链表的合并,合并后head1和merged1都指向合并后的新链表的头结点
// ListNode merged1 = merge(head1, head2);
// print(merged1);
// // 测试含有一个null头指针的链表的合并,由于head2指向上一步合并后的新链表的第二个节点,所以输出的节点个数为总个数-1
// print(merge(head2, null));
// // 测试两个链表中只有一个节点
// print(merge(null, new ListNode(10, null)));
ListNode merged1 = mergeSortedList(head1, head2);
print(merged1);
// 测试含有一个null头指针的链表的合并,由于head2指向上一步合并后的新链表的第二个节点,所以输出的节点个数为总个数-1
print(mergeSortedList(head2, null));
// 测试两个链表中只有一个节点
print(mergeSortedList(null, new ListNode(10, null)));
}
}
剑指offer面试题17:合并两个排序的链表的更多相关文章
- 剑指Offer:面试题17——合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路1: 分别用p1,p2两个指针扫描两个有序链表,p3指针去构建新链表h3. p1.val & ...
- 剑指Offer - 九度1519 - 合并两个排序的链表
剑指Offer - 九度1519 - 合并两个排序的链表2013-11-30 22:04 题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.(hi ...
- 剑指offer十六之合并两个排序的链表
一.题目 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 二.思路 注:链表1和链表2是两个递增排序的链表,合并这两个链表得到升序链表为链表3. 首先分析 ...
- 【剑指Offer】16、合并两个排序的链表
题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解题思路: 首先需要判断几个特殊情况,即判断输入的两个指针是否为空.如果第一个 ...
- 剑指offer(16)合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 重点抓住这两个链表都是单挑递增的,因此我们只需要不断地比较他们的头结点就行,明显这是个 ...
- 剑指offer-面试题17.合并两个排序的链表
题目:输入两个递增的排序的链表,合并这两个链表并使新链表中的节点仍然是 按照递增排序的.例如链表1链表2合并为链表3. List1:->->-> List2:->->-& ...
- 《剑指offer》面试题17 合并两个排序的链表 Java版
我的方法:新初始化一个链表头,比较两个链表当前节点的大小,然后连接到该链表中.遍历两个链表直到null为止. public ListNode merge(ListNode first, ListNod ...
- 【剑指offer】面试题 25. 合并两个排序的链表
面试题 25. 合并两个排序的链表 NowCoder 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. Java 实现 ListNode Clas ...
- 【剑指Offer面试题】 九度OJ1518:反转链表
与其非常快写出一段漏洞百出的代码,倒不如细致分析再写出鲁棒的代码. 提前想好測试用例(输入非空等等)进行測试改动代码. 题目链接地址: http://ac.jobdu.com/problem.php? ...
随机推荐
- python—列表生成式
#原始写法 l=[] for i in range(1,11): l.append(str(i).zfill(2)) print(l) #结果:['01', '02', '03', '04', '05 ...
- mysql 多列索引学习-经典实例
索引优化 ,b-tree假设某个表有一个联合索引(c1,c2,c3,c4) 以下 只能使用该联合索引的c1,c2,c3部分A. where c1 = x and c2 = x and c4>x ...
- Redis分布式缓存
Redis 主 slave 数据库优化-- 加inex, 分区 JVM调优--参数设置,比如偏向于计算的如何设置? 线程池:queue放满了之后,有什么方式能让他不拒绝掉?blockqueue就等在那 ...
- “无法将“Enable-Migrations”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。”的一种解决方式
通过以下几个步骤解决: 1.install-package entityFramework: 2.更新 nuget: 3.更新 visual studio: 我是通过第三个步骤解决的.
- Java-HashMap、HashSet、hashTable
HashMap:key:可null,重复的key对应的value会出现后面覆盖前面的情况.value:可null; 引用:数组,数组中存链表. HashSet使用HashMap的实现存储数据,所以有H ...
- 一、selenium 环境搭建
本教程演示是在window系统上演示,linux.mac 系统以后会更新. 1.准备工作 1.python2或者python3安装包,官网:https://www.python.org/downloa ...
- 关于python27和windows系统的中文编码问题
最近想写一个python脚本实现对文件夹中的文件进行批量命名.每个文件对应从txt文档中提取出来的一行,因为文件名是中文,所以涉及到了一些中文编码的问题. 脚本运行环境是win10+python27 ...
- mac查看当前调用tcp的进程并关闭指定进程
查看所有tcp进程 监听的端口 lsof -iTCP -sTCP:LISTEN 查看指定端口信息 lsof -i: 关闭指定进程 kill -
- mac电脑Git提交代码到Github提示git-credential-osxkeychain 验证解决方案
## 啊哈哈 这个简单,直接给出当前mac电脑登录账号密码即可,^_*,拿走不谢!!
- Find them, Catch them POJ - 1703
题意:N个人,M次操作,操作一:A X Y,X,Y不是同一帮派,操作二:D X Y,判断X和Y的关系. 思路:如果X和Y不是同一帮派,那X与Y+N.Y与X+N是同一帮派,如果X与Y不在同一帮派且X与Y ...