合并两个链表

给你两个链表 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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时长两年半的某

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值