一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第25天,点击查看活动详情。
合并两个有序链表
题目解析
题目素材解析
根据本道题的描述来看,是提供了两个参数。
- 两个正序(升序)链表。
并且题目中给出了链表的数据结构类代码。
两个链表的节点数目在0到50之间,所以这里一定要对链表参数判空处理。
我的解读
我对本道题的解读,大概有着几个重点知识要解决。
一,搞清楚链表的数据结构,并且在链表的获取下一个节点时中间值的处理。
二,特殊情况的处理,比如说链表为空时的处理。
三,如何退出链表的循环。
搞清这三点就完全可以解决这道题了。
解题思路
有了上面的思路,解答这道题就没什么难度了。
第一步,先处理特殊情况,就是两个链表可能为空的情况,如果两个都为空,则直接返回空;如果其中一个为空,则返回另外一个链表。
第二步,声明一个结果链表,和中间值。
第三步,开始循环比对,在每次循环中将较小的值存入结果中间值中,并且在结束时声明中间值的next元素。
第四步,如何结束循环呢,可以利用其中一个链表不再有下一节点的情况为终结,没有下一个节点了,则下一个节点就是另外一个链表剩下的节点了,直接赋值给中间值z即可。
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
//特殊情况处理
if(list1 == null && list2 == null){
return null;
}else if(list1 == null){
return list2;
}else if(list2 == null){
return list1;
}
//结果值声明
ListNode result = new ListNode();
//中间值声明
ListNode z = result;
//循环比对
while (true){
//对比填充值
if(list1.val <= list2.val){
z.val = list1.val;
list1 = list1.next != null ? list1.next : null;
}else{
z.val = list2.val;
list2 = list2.next != null ? list2.next : null;
}
//判断是否退出循环
if(list1 == null){
z.next = list2;
break;
}else if(list2 == null){
z.next = list1;
break;
}
z.next = new ListNode();
z = z.next;
}
return result;
}
}
执行结果
这道题答得还行,速度还是非常可观的。
Java代码本地执行
Java本地可调试代码,请参考github/Ijiran,可通过索引看到相应代码。
如下图所示: