Problem Statement
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:

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.
Try here before watching the video.
Video Explanation
Java Code
class Solution {
    public ListNode mergeInBetween(ListNode list1, int a, int b, ListNode list2) {
        ListNode start = null, end = list1;
        for(int i = 0; i <= b; i++) {
            if(i == a - 1) {
                start = end;
            }
            end = end.next;
        }
        start.next = list2;
        while(list2.next != null) {
            list2 = list2.next;
        }
        list2.next = end;
        return list1;
    }
}
C++ Code
class Solution {
public:
    ListNode* mergeInBetween(ListNode* list1, int a, int b, ListNode* list2) {
        ListNode* start = NULL;
        ListNode* end = list1;
        for(int i = 0; i <= b; i++) {
            if(i == a - 1) {
                start = end;
            }
            end = end->next;
        }
        start->next = list2;
        while(list2->next != NULL) {
            list2 = list2->next;
        }
        list2->next = end;
        return list1;
    }
};
Python Code
class Solution:
    def mergeInBetween(self, list1: ListNode, a: int, b: int, list2: ListNode) -> ListNode:
        start = None
        end = list1
        for i in range(b + 1):
            if i == a - 1:
                start = end
            end = end.next
        start.next = list2
        while list2.next is not None:
            list2 = list2.next
        list2.next = end
        return list1
Javascript Code
var mergeInBetween = function(list1, a, b, list2) {
    let start = null;
    let end = list1;
    for(let i = 0; i <= b; i++) {
        if(i === a - 1) {
            start = end;
        }
        end = end.next;
    }
    start.next = list2;
    while(list2.next !== null) {
        list2 = list2.next;
    }
    list2.next = end;
    return list1;
};
Go Code
func mergeInBetween(list1 *ListNode, a int, b int, list2 *ListNode) *ListNode {
    start := &ListNode{}
    end := list1
    for i := 0; i <= b; i++ {
        if i == a - 1 {
            start = end
        }
        end = end.Next
    }
    start.Next = list2
    for list2.Next != nil {
        list2 = list2.Next
    }
    list2.Next = end
    return list1
}
Complexity Analysis
Time Complexity: O(M + N), where M is the length of list1 and N is the length of list2.
Space Complexity: O(1), we are not using any extra space.
