Losing head/tail while rewiring
Wrong move: Pointer updates overwrite references before they are saved.
Usually fails on: List becomes disconnected mid-operation.
Fix: Store next pointers first and use a dummy head for safer joins.
Move from brute-force thinking to an efficient approach using linked list strategy.
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 <= 1041 <= a <= b < list1.length - 11 <= list2.length <= 104Problem summary: 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.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Linked List
[10,1,13,6,9,5] 3 4 [1000000,1000001,1000002]
[0,1,2,3,4,5,6] 2 5 [1000000,1000001,1000002,1000003,1000004]
Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1669: Merge In Between Linked Lists
/**
* 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;
while (--a > 0) {
p = p.next;
}
while (b-- > 0) {
q = q.next;
}
p.next = list2;
while (p.next != null) {
p = p.next;
}
p.next = q.next;
q.next = null;
return list1;
}
}
// Accepted solution for LeetCode #1669: Merge In Between Linked Lists
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeInBetween(list1 *ListNode, a int, b int, list2 *ListNode) *ListNode {
p, q := list1, list1
for ; a > 1; a-- {
p = p.Next
}
for ; b > 0; b-- {
q = q.Next
}
p.Next = list2
for p.Next != nil {
p = p.Next
}
p.Next = q.Next
q.Next = nil
return list1
}
# Accepted solution for LeetCode #1669: Merge In Between Linked Lists
# 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):
q = q.next
p.next = list2
while p.next:
p = p.next
p.next = q.next
q.next = None
return list1
// Accepted solution for LeetCode #1669: Merge In Between Linked Lists
struct Solution;
use rustgym_util::*;
impl Solution {
fn merge_in_between(list1: ListLink, a: i32, b: i32, list2: ListLink) -> ListLink {
let mut l1 = vec![];
let mut l2 = vec![];
let mut p1 = list1;
let start = a as usize;
let end = (b + 1) as usize;
while let Some(mut node) = p1 {
p1 = node.next.take();
l1.push(node);
}
let mut p2 = list2;
while let Some(mut node) = p2 {
p2 = node.next.take();
l2.push(node);
}
let mut prev = None;
for _ in (end..l1.len()).rev() {
let mut node = l1.pop().unwrap();
node.next = prev;
prev = Some(node);
}
for _ in (start..end).rev() {
l1.pop();
}
for _ in (0..l2.len()).rev() {
let mut node = l2.pop().unwrap();
node.next = prev;
prev = Some(node);
}
for _ in (0..start).rev() {
let mut node = l1.pop().unwrap();
node.next = prev;
prev = Some(node);
}
prev
}
}
#[test]
fn test() {
let list1 = list![0, 1, 2, 3, 4, 5];
let a = 3;
let b = 4;
let list2 = list![1000000, 1000001, 1000002];
let res = list![0, 1, 2, 1000000, 1000001, 1000002, 5];
assert_eq!(Solution::merge_in_between(list1, a, b, list2), res);
let list1 = list![0, 1, 2, 3, 4, 5, 6];
let a = 2;
let b = 5;
let list2 = list![1000000, 1000001, 1000002, 1000003, 1000004];
let res = list![0, 1, 1000000, 1000001, 1000002, 1000003, 1000004, 6];
assert_eq!(Solution::merge_in_between(list1, a, b, list2), res);
}
// Accepted solution for LeetCode #1669: Merge In Between Linked Lists
/**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function mergeInBetween(
list1: ListNode | null,
a: number,
b: number,
list2: ListNode | null,
): ListNode | null {
let p = list1;
let q = list1;
while (--a > 0) {
p = p.next;
}
while (b-- > 0) {
q = q.next;
}
p.next = list2;
while (p.next) {
p = p.next;
}
p.next = q.next;
q.next = null;
return list1;
}
Use this to step through a reusable interview workflow for this problem.
Copy all n nodes into an array (O(n) time and space), then use array indexing for random access. Operations like reversal or middle-finding become trivial with indices, but the O(n) extra space defeats the purpose of using a linked list.
Most linked list operations traverse the list once (O(n)) and re-wire pointers in-place (O(1) extra space). The brute force often copies nodes to an array to enable random access, costing O(n) space. In-place pointer manipulation eliminates that.
Review these before coding to avoid predictable interview regressions.
Wrong move: Pointer updates overwrite references before they are saved.
Usually fails on: List becomes disconnected mid-operation.
Fix: Store next pointers first and use a dummy head for safer joins.