题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
解题过程:
遇到链表题,老是会有抠边界的问题,临场思路要是不清晰就会出问题,就这个问题,我做了以下的总结:
第1步:审清题目:合并后是有序的,而且两个链表本身也是有序的
第2步:在边界上抠不清楚,代码冗余度很高,分块处理:
1)把特殊情况拎出来先处理,像个数不到要求,null的这种
2)把普通的情况及正常运行的情况做一个循环处理
3)把边界做一个总体处理
下面是我的解法
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
//1)特殊情况处理
if(list1 == null && list2 == null)
return null;
else if(list1 == null)
return list2;
else if(list2 == null)
return list1;
//2)正常情况处理
ListNode cur = new ListNode(0);
ListNode list = cur;
//只要出现一个是null就退出,临界情况交给后面处理
while(list1!=null && list2!=null){
int x = list1.val;
int y = list2.val;
if(x>y){
cur.next = new ListNode(y);
list2 = list2.next; //list2继续往后走,list1不动
}
else {
cur.next = new ListNode(x);
list1 = list1.next;
}
cur = cur.next;
}
//3)边界情况部分处理
//到临界点,有一个是null或者两个都是null
if(list1!=null && list2==null)
cur.next = list1;
else if(list1==null && list2!=null)
cur.next = list2;
else if(list1==null && list2==null)
cur.next = null;
return list.next;
}
}
运行时间:28ms
占用内存:9668k
大佬的递归做法,但我还是不太擅长递归,有时候想不明白。用的好,代码清晰简洁 ,用不好,自己被绕进去出不来,或者根本就进不去呵呵……
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
//递归版本
if(list1 == null)
return list2;
if(list2 == null)
return list1;
if(list1.val <= list2.val){
list1.next = Merge(list1.next,list2);
return list1;
}
else {
list2.next = Merge(list1,list2.next);
return list2;
}
}
}
运行时间:31ms
占用内存:9316k
递归方法总结:
用递归一定要找到出口,而且在你退出一个递归向上回溯的时候,一定要更新递归出口,这样就很容易能找到头绪了。
第一步:先找递归出口,抓住后放到函数开头
第二步:使用函数开始往下递归过程,遇到出口,开始回溯
第三步:更新出口(这步最关键,记住,只要有了出口,一定要记得分析更新出口)
如果你们有什么好的想法,欢迎与我交流分享,如果你觉得我的博文对你有益,希望不吝点赞哦 !