给你两个链表 list1 和 list2 ,它们包含的元素分别为 n 个和 m 个。
请你将 list1 中下标从 a 到 b 的全部节点都删除,并将list2 接在被删除节点的位置。
下图中蓝色边和节点展示了操作后的结果:
请输出结果链表。
示例 1:
输入:list1 = [0,1,2,3,4,5], a = 3, b = 4, list2 = [1000000,1000001,1000002]
输出:[0,1,2,1000000,1000001,1000002,5]
解释:我们删除 list1 中下标为 3 和 4 的两个节点,并将 list2 接在该位置。上图中蓝色的边和节点为答案链表。
示例 2:
输入:list1 = [0,1,2,3,4,5,6], a = 2, b = 5, list2 = [1000000,1000001,1000002,1000003,1000004]
输出:[0,1,1000000,1000001,1000002,1000003,1000004,6]
解释:上图中蓝色的边和节点为答案链表。
输入说明 :
首先输入第一个链表长度n,然后输入n个整数,以空格分隔。
然后输入第二个链表长度m,然后输入m个整数,以空格分隔。
最后输入两个整数a 和 b
3<=n<=10^4
1<=m<=10^4
1<=a<=b<n
输出说明 :
输出格式见范例。
输入范例 :
6
0 1 2 3 4 5
3
1000000 1000001 1000002
3 4
输出范例 :
head-->0-->1-->2-->1000000-->1000001-->1000002-->5-->tail
源码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <string.h>
using namespace std;
struct ListNode
{
ListNode* next;
int val;
};
ListNode* mergeInBetween(ListNode *head1, int a, int b, ListNode *head2) {
ListNode *before = head1, *after = head1;
for (int i = 0; i <a; i++) {
before = before->next; //找到编号a之前的所有节点并定位到a-1节点 ,将list2的头连接在其之后
}
for (int i = 0; i <= b+1; i++) {
after = after->next; //找到编号b之后的所有节点并定位到编号为b+1的节点,将list2的尾连接在其之前
}
ListNode* start = head2;
ListNode* end = head2;
start = start->next;
while (end->next != NULL) {
end = end->next;
}
before->next = start;
end->next = after;
return head1;
}
ListNode* createByTail(int len)
{
ListNode* head = new ListNode;
ListNode* p, * temp;
p = head;
head->next = NULL;
int data, i;
for (i = 0; i < len; i = i + 1)
{
cin >> data;
temp = new ListNode;
temp->val = data;
p->next = temp;
p = temp;
}
p->next = NULL;
return head;
}
void output(ListNode* head)
{
ListNode* p1;
p1 = head;
p1 = p1->next;
cout << "head-->";
while (p1 != NULL)
{
cout << p1->val << "-->";
if ((p1->next != NULL))
p1 = p1->next;
else
break;
}
cout << "tail" << endl;
return;
}
int main()
{
ListNode* head1;
int len1, len2;
cin >> len1;
head1 = createByTail(len1);
cin >> len2;
ListNode* head2;
head2 = createByTail(len2);
int a, b;
cin >> a >> b;
head1 = mergeInBetween(head1, a, b, head2);
output(head1);
}