題目描述
輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,當然我們需要合成後的鏈表滿足單調不減規則。
解題過程:
遇到鏈表題,老是會有摳邊界的問題,臨場思路要是不清晰就會出問題,就這個問題,我做了以下的總結:
第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
遞歸方法總結:
用遞歸一定要找到出口,而且在你退出一個遞歸向上回溯的時候,一定要更新遞歸出口,這樣就很容易能找到頭緒了。
第一步:先找遞歸出口,抓住後放到函數開頭
第二步:使用函數開始往下遞歸過程,遇到出口,開始回溯
第三步:更新出口(這步最關鍵,記住,只要有了出口,一定要記得分析更新出口)
如果你們有什麼好的想法,歡迎與我交流分享,如果你覺得我的博文對你有益,希望不吝點贊哦 !