开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情
1669. 合并两个链表
给你两个链表 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]
解释: 上图中蓝色的边和节点为答案链表。
提示:
3 <= list1.length <= 1041 <= a <= b < list1.length - 11 <= list2.length <= 104
思路
解法一:就是一步步往后迭代,创建一个新的节点;把另外两个lists叠加上去; 解法二:先不改变指针的指向,先确定需要修改的指针的位置,然后一次性改完,时间与上面差不多
ac代码
class Solution {
public:
ListNode* mergeInBetween(ListNode* list1, int a, int b, ListNode* list2) {
ListNode *dummy = new ListNode(0);
ListNode *p = dummy;
ListNode *p1 = list1;
ListNode *p2 = list2;
// 先把 位置a之前的拼接到dummy上
int i=0;
for (; i<a; i++){
p->next = p1;
p = p->next;
p1 = p1->next;
}
// 这里是将整个 list2 全部拼接上去的阿
p->next = p2;
// 然后将p遍历到最后一个节点,去接上p1;
while (p->next != nullptr){
p = p->next;
}
// 现在来接上
for (; i<b+1; i++){
p1 = p1->next;
}
p->next = p1;
return dummy->next;
}
};
ac2
class Solution {
public:
ListNode* mergeInBetween(ListNode* list1, int a, int b, ListNode* list2) {
// 另外的方法就是找到链表的关键位置的指针,然后将指针的指向进行挪动从而找到最优的
ListNode *p = list1;
int i=0;
for (; i<a-1; ++i){
p = p->next;
}
ListNode *node_a = p; // a节点
for (; i<b; ++i){
p = p->next;
}
ListNode *node_b = p; // b节点
ListNode *p1 = list2;
while(p1->next != nullptr){
p1 = p1->next;
}
ListNode *tail = p1; // 尾节点
// 以上没有对list1做任何修改,现在开始做修改
node_a->next = list2;
tail->next = node_b->next;
return list1;
}
};