Merge In Between Linked Lists

medium linked list pointers

Problem

You get two singly linked lists, list1 with n nodes and list2 with m nodes, plus two indices with 1 ≤ a ≤ b < n − 1. Delete list1's nodes from index a through index b and wire all of list2 into the gap: node a − 1 must point at list2's head, and list2's last node must point at node b + 1. Return list1's head.

Inputlist1 = 10 → 1 → 13 → 6 → 9 → 5, a = 3, b = 4, list2 = 100 → 101 → 102
Output10 → 1 → 13 → 100 → 101 → 102 → 5
Nodes 6 and 9 (indices 3..4) are cut out; node 13 now points at 100, and 102 points at 5.

def merge_in_between(list1, a, b, list2):
    prev = list1
    for _ in range(a - 1):
        prev = prev.next
    after = prev
    for _ in range(b - a + 2):
        after = after.next
    prev.next = list2
    tail = list2
    while tail.next:
        tail = tail.next
    tail.next = after
    return list1
function mergeInBetween(list1, a, b, list2) {
  let prev = list1;
  for (let i = 0; i < a - 1; i++) prev = prev.next;
  let after = prev;
  for (let i = 0; i < b - a + 2; i++) after = after.next;
  prev.next = list2;
  let tail = list2;
  while (tail.next) tail = tail.next;
  tail.next = after;
  return list1;
}
ListNode mergeInBetween(ListNode list1, int a, int b, ListNode list2) {
    ListNode prev = list1;
    for (int i = 0; i < a - 1; i++) prev = prev.next;
    ListNode after = prev;
    for (int i = 0; i < b - a + 2; i++) after = after.next;
    prev.next = list2;
    ListNode tail = list2;
    while (tail.next != null) tail = tail.next;
    tail.next = after;
    return list1;
}
ListNode* mergeInBetween(ListNode* list1, int a, int b, ListNode* list2) {
    ListNode* prev = list1;
    for (int i = 0; i < a - 1; i++) prev = prev->next;
    ListNode* after = prev;
    for (int i = 0; i < b - a + 2; i++) after = after->next;
    prev->next = list2;
    ListNode* tail = list2;
    while (tail->next) tail = tail->next;
    tail->next = after;
    return list1;
}
Time: O(n + m) Space: O(1)