LeetCode之兩有序列表合併
自己卡在某個死角
問題
ListNode head=null;
head=l1;
l1=l1.next;
head=head.next;
以上代碼 導致 我最好拿到head是鏈表的末尾,而鏈表又是單鏈表,不能逆轉
解決方案
new一個空的head,然後操作head的next
public ListNode headMergeTwoLists(ListNode l1, ListNode l2) {
ListNode dump = new ListNode(0);
ListNode cur = dump;
while(l1 != null || l2 != null) {
if(l1 == null) {
cur.next = l2;
l2 = l2.next;
}else if (l2 == null) {
cur.next = l1;
l1 = l1.next;
}else if(l1.val < l2.val){
cur.next = l1;
l1 = l1.next;
}else{
cur.next = l2;
l2 = l2.next;
}
cur = cur.next;
}
return dump.next;
}
- 總結
第一輪的時候,cur持有的是dump引用,然後對cur.next賦值 ,其實就是對dump.next賦值,然後通過cur這邊變量作爲中轉,將l1,l2鏈表搬移到 dump鏈上面
遞歸
- 代碼
public ListNode recursionMergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
}
if (l2 == null) {
return l1;
}
ListNode header = null;
if (l1.val <= l2.val) {
header = l1;
header.next = recursionMergeTwoLists(l1.next, l2);
} else {
header = l2;
header.next = recursionMergeTwoLists(l1, l2.next);
}
return header;
}
- 總結:
- 怎麼遞歸能形成鏈表
分析遞歸過程:
1. new 一個鏈表對象
2. 賦值
3. 遞歸給鏈表 next對象賦值
這樣鏈表就形成,每次遞歸的時候,都是在給上一個鏈表節點next賦值(鏈表頭例外),然後遞歸的給自己節點next賦值 - 爲什麼返回鏈表的頭
1. 遞歸的時候,是從最底層開發返回,要返回到最外層,所以返回的是最外的header對象,最外層的header對象就是鏈表頭
總結下:說白就是用遞歸的返回的特性,實現單項列表,正向的遍歷後,逆向返回過程 - 盜用一張別人圖,分析過程
- 怎麼遞歸能形成鏈表
- 借鑑博客: CSDN
不得不吐槽下自己
以上方案都是百度到,而不是自己想到的,這麼簡單的題目,卡了很久,不得不反省下自己