LeetCode - 1669 - 合并两个链表 - Java - 细喔

x33g5p2x  于2022-01-05 转载在 Java  
字(1.2k)|赞(0)|评价(0)|浏览(321)

题目

题目解析 与 思维

删除 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 是一样的道理。

相关文章