一、题目
给你两个链表 list1 和 list2 ,它们包含的元素分别为 n 个和 m 个。
请你将 list1 中下标从 a 到 b 的全部节点都删除,并将list2 接在被删除节点的位置。
下图中蓝色边和节点展示了操作后的结果:
请你返回结果链表的头指针。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/merge-in-between-linked-lists/
二、C解法
我的思路及代码
我们需要两个指针:
indexFore 用来指向a前面一个节点,以便后面让此节点的next指向 list2
indexRear 用来指向b,以便让 list2 最后一个元素的next可以接回list1
需要注意,indexFore 需要在确定了 indexRear 的位置后,才可以让此节点的 next 指向 list2 ,否则将会丢失 list1 后面的节点
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeInBetween(struct ListNode* list1, int a, int b, struct ListNode* list2){
struct ListNode* indexFore = list1;
struct ListNode* indexRear;
for(int i=0;i<a-1;i++){
indexFore = indexFore->next;
}
indexRear = indexFore;
for(int i=a;i<b+1;i++){
indexRear = indexRear->next;
}
indexFore->next= list2;
while(list2->next!=NULL){
list2=list2->next;
}
list2->next = indexRear->next;
return list1;
}
- 时间复杂度:时间复杂度:O(n+m),其中 n 是 list1 的长度,m 是 list2的长度
- 空间复杂度:空间复杂度:O(1)
官方参考代码
和我的思路一样的,随便看看就行
struct ListNode* mergeInBetween(struct ListNode* list1, int a, int b, struct ListNode* list2) {
struct ListNode* preA = list1;
for (int i = 0; i < a - 1; i++) {
preA = preA->next;
}
struct ListNode* preB = preA;
for (int i = 0; i < b - a + 2; i++) {
preB = preB->next;
}
preA->next = list2;
while (list2->next != NULL) {
list2 = list2->next;
}
list2->next = preB;
return list1;
}
- 时间复杂度:时间复杂度:O(n+m),其中 n 是 list1 的长度,m 是 list2的长度
- 空间复杂度:空间复杂度:O(1)