删除 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://blog.csdn.net/DarkAndGrey/article/details/122308192
内容来源于网络,如有侵权,请联系作者删除!