文章目錄
- 題目
- 題目決議 與 思維
- 這題沒什么細節,我直接上代碼,你們應該都看得懂!
- 還是有個小小細節,來自于題目題干,
題目

?
題目決議 與 思維
洗掉 list1 下標為 a 到 下標為b 的之間所有節點(包括 下標 a,b兩個節點),
之后便是,將 list2 插入到 list1 中 原先 a 與 b 所在的那個位置
難點就在于 如何確定 a 的前驅節點 和 b的后驅節點,這樣我們的list2 接入 list1,簡單要死,定義一個 list2 的 頭節點替身 ,讓它去遍歷list2的鏈表節點,找到最后一個節點的位置,
限制條件:while(head.next != null) head = head.next;
然后,就是合并:a的前驅節點的 next = list2;head.next = b的后驅節點
這題就完成了!
?
這題沒什么細節,我直接上代碼,你們應該都看得懂!
class Solution {
public ListNode mergeInBetween(ListNode list1, int a, int b, ListNode list2) {
ListNode begin = list1;// 記錄 list1 下標為 a 的前驅節點
ListNode end = list1;// 記錄 list1 下標為 b 的后驅節點
for(int i = 0;i < a-1;i++){// 找到下標為 a -1 的節點,也就是 下標為 a 的前驅節點
begin = begin.next;
}
for(int i = 0;i < b+1;i++){// 找到 下標為 b 的 后驅節點
end = end.next;
}
ListNode cur = list2;// 代替 list2 去遍歷 自身 鏈表節點
while(cur.next != null){// 找到list2的尾節點
cur = cur.next;
}
// 將 list2 接入 list1中 原先 a 與 b 的位置
// 同時,list1 原先下標為 a 的節點,就沒有被呼叫了
// 最終,會被 JVM 回收空間,然后下標 a 后面的 節點 也是一樣的,
// 就這樣,一個接一個將 a 與 b 之間的節點全部回收(包括a、b兩個節點)
// 也就說 在list1 接入list2 的時候,間接的洗掉 原先的節點,
begin.next = list2;
cur.next = end;
return list1;
}
}

還是有個小小細節,來自于題目題干,

注意 下標兩個字眼!!!!!
也就是說 list1 第一個節點 對應的下標是 0.,第二個節點下標是1,以此類推,找到 a 的前驅節點,就需要 回圈變數 i < a -1,
有的人可能會說: 既然 a 是下標,那么為什么我們不是 i < a,下標與節點一一對應嘛!
你這需要仔細看我的代碼
當 i == 0 時, begin 和 end ,已經走了一步,走到 下標為 1 的節點位置,也就是說 你要走到 下標為 a 的位置, begin 只需要走 a -1步(i < a);
那么 a的前驅節點,就只需要走 a-1-1 步,不就是 i < a -1.,
后驅節點 b 也是同理,要想走到 后驅節點位置,只需 i < b +1 步,
這跟我們陣列計算出元素個數,最大下標等于 元素個數減1 是一樣的道理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/403959.html
標籤:其他





