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 incidate the result:

Build the result list and return its head.
Example 1:

Input: list1 = [0,1,2,3,4,5], a = 3, b = 4, list2 = [1000000,1000001,1000002] Output: [0,1,2,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
Solution: List Operations
Find the following nodes:
1. previous node to the a-th node: prev_a
2. the b-th node: node_b
3. tail node of list2: tail2
prev_a->next = list2
tail2->next = node_b
return list1
Time complexity: O(m+n)
Space complexity: O(1)
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// Author: Huahua class Solution { public: ListNode* mergeInBetween(ListNode* list1, int a, int b, ListNode* list2) { ListNode dummy(0, list1); ListNode* prev_a = &dummy; for (int i = 0; i < a; ++i) prev_a = prev_a->next; ListNode* node_b = prev_a->next; for (int i = a; i <= b; ++i) node_b = node_b->next; ListNode* tail2 = list2; while (tail2->next) tail2 = tail2->next; prev_a->next = list2; tail2->next = node_b; return list1; } }; |