题目描述
给你两个链表 list1 和 list2 ,它们包含的元素分别为 n 个和 m 个。请你将 list1 中下标从 a 到 b 的全部节点都删除,并将list2 接在被删除节点的位置。请你返回结果链表的头指针。3 <= list1.length <= 10^41 <= a <= b < list1.length - 1 可以不用考虑,a-b删除完之后,list1为空1 <= list2.length <= 10^4
示例
示例:输入:list1 = [0,1,2,3,4,5], a = 3, b = 4, list2 = [1000000,1000001,1000002]输出:[0,1,2,1000000,1000001,1000002,5]
思路
这个其实是一个典型的操作链表的题目,相当于将A链表插入到B链表的中间去,只是这里还有将B链表中的部分结点删去的动作。但是只要对链表理解到了都很简单。首先遍历链表list1,找到下标为a的结点,并且记录a的上一个结点,然后找到下标为b的结点,并且记录b的下一个结点,然后找到list2的最后一个结点,接下来开始进行连接操作,将a的上一个结点的next指向list2的头结点,将list2的最后一个结点指向b的下一个结点,即可完成连接操作,符合题意。
实现
实现很简单,将上述思路实现即可。github地址
public static void main(String[] args) {
MergeInBetween mergeInBetween = new MergeInBetween();
ListNode list1 = new ListNode(0);
list1.next = new ListNode(1);
list1.next.next = new ListNode(2);
list1.next.next.next= new ListNode(3);
list1.next.next.next.next= new ListNode(4);
list1.next.next.next.next.next = new ListNode(5);
ListNode list2 = new ListNode(100000);
list2.next = new ListNode(2000);
ListNode result = mergeInBetween.mergeInBetween(list1, 3, 4, list2);
System.out.println("ddd");
}
public ListNode mergeInBetween(ListNode list1, int a, int b, ListNode list2) {
ListNode tempList1 = list1;
//记录A下标的上一个结点
ListNode lastA = null;
//记录B下边的下一个结点
ListNode nextB = null;
int index = 0;
ListNode last = null;
while (null != tempList1) {
if (index == a) {
lastA = last;
}
if (index == b) {
nextB = tempList1.next;
break;
}
last = tempList1;
tempList1 = tempList1.next;
++ index;
}
//记录list2的最后一个结点
ListNode last2 = null;
ListNode tempList2 = list2;
while (null != tempList2) {
last2 = tempList2;
tempList2 = tempList2.next;
}
//连接两个链表
lastA.next = list2;
last2.next = nextB;
return list1;
}