题目介绍
力扣1669题:leetcode-cn.com/problems/me…
分析
可以很快就能想到,只需要得到第a个节点的前一个节点设为left和第b个节点的后一个节点设为right。
然后,将left节点指向list2的头节点,将list2的尾节点指向right节点,即可完成题目要求!
怎么得到left和right这两个节点呢?
看示例不难得出,该题目所谓的第几个节点,其实是从0开始计算的,也就是链表的头节点即为第0个节点。那么得到left节点,只需从list1的头节点往后next->(a - 1)次即可。得到right节点,只需从left节点往后next->(b - a + 2)次即可。最后那么一连,就行了!
有的大家可能对b - a + 2的怎么来的不太明白:(b + 1)-(a - 1)= b + 1-a + 1 = b - a + 2
代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeInBetween(ListNode list1, int a, int b, ListNode list2) {
ListNode cur = list1;
int count = b - a + 2;
// 找到list1中第a个节点的前一个节点
while ((a - 1) > 0) {
a--;
cur = cur.next;
}
ListNode left = cur;
// 找到list1中第b个节点的后一个节点
while (count > 0) {
cur = cur.next;
count--;
}
ListNode right = cur;
// 将list1中第a个节点的前一个节点指向list2的头节点
left.next = list2;
// 找到list2的尾节点
while(list2.next != null) {
list2 = list2.next;
}
// 将list2的尾节点指向list1中第b个节点的后一个节点
list2.next = right;
return list1;
}
}