You are given two linked lists: list1
and list2
of sizes n
and m
respectively.
Remove list1
's nodes from the ath
node to the bth
node, and put list2
in their place.
The blue edges and nodes in the following figure indicate the result:
Build the result list and return its head.
Example 1:
Input: list1 = [10,1,13,6,9,5], a = 3, b = 4, list2 = [1000000,1000001,1000002] Output: [10,1,13,1000000,1000001,1000002,5] Explanation: We remove the nodes 3 and 4 and put the entire list2 in their place. The blue edges and nodes in the above figure indicate the result.
Example 2:
Input: list1 = [0,1,2,3,4,5,6], a = 2, b = 5, list2 = [1000000,1000001,1000002,1000003,1000004] Output: [0,1,1000000,1000001,1000002,1000003,1000004,6] Explanation: The blue edges and nodes in the above figure indicate the result.
Constraints:
3 <= list1.length <= 104
1 <= a <= b < list1.length - 1
1 <= list2.length <= 104
Given two linked lists, list1
and list2
, remove nodes from list1
starting from the a
-th node to the b
-th node (inclusive) and insert list2
in their place. Return the head of the modified list1
.
The solution directly simulates the merge operation. We traverse list1
to find the nodes just before the a
-th node and the b
-th node. Then, we link the node before a
to the head of list2
and the tail of list2
to the node after b
.
p
and q
, are initialized to the head of list1
.p
is moved a-1
steps to reach the node before the a
-th node. q
is moved b
steps to reach the b
-th node.next
pointer of p
is set to the head of list2
.list2
: We traverse list2
until we reach its tail (p
will now point to the tail of list2
).next
pointer of p
is set to the node after b
(which is q.next
).q.next
is set to null
to detach the removed section from list1
.list1
is returned.list1
and 'n' is the length of list2
. We traverse list1
to find the split points and traverse list2
to find its tail.# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def mergeInBetween(self, list1: ListNode, a: int, b: int, list2: ListNode) -> ListNode:
p = q = list1
for _ in range(a - 1):
p = p.next
for _ in range(b + 1): #Corrected the loop condition here
q = q.next
p.next = list2
while p.next:
p = p.next
p.next = q
return list1
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeInBetween(ListNode list1, int a, int b, ListNode list2) {
ListNode p = list1, q = list1;
for (int i = 0; i < a - 1; ++i) p = p.next;
for (int i = 0; i <= b; ++i) q = q.next;
p.next = list2;
while (p.next != null) p = p.next;
p.next = q;
return list1;
}
}
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeInBetween(ListNode* list1, int a, int b, ListNode* list2) {
ListNode* p = list1, *q = list1;
for (int i = 0; i < a - 1; ++i) p = p->next;
for (int i = 0; i <= b; ++i) q = q->next;
p->next = list2;
while (p->next != nullptr) p = p->next;
p->next = q;
return list1;
}
};
(Other languages like Go, TypeScript, and C# would follow a similar structure, adapting syntax as needed.)
Note: The code examples provided are optimized for clarity and conciseness. Error handling (e.g., checking for null pointers or invalid input) could be added for robustness in a production environment.