Fundamentals/Patterns/Two Pointers — Merge3 problems· Two Pointers

Two pointers across two sorted inputs, advancing whichever is smaller

When to useMerging sorted arrays/lists, intersection/union of sorted sequences

iterative
Merge Sorted Arrays
merge_sorted_arrays
Merge Two Sorted Lists
merge_two_sorted_lists
Teleporter Arrays
get_maximum_score
INITIALIZE
i, j for each input; result array
const result = [];
let i = 0, j = 0;
const dummy = new ListNode(0);
let cur = dummy;
const MOD = 10 ** 9 + 7;
let i = 0, j = 0;
let sum1 = 0, sum2 = 0;
let total = 0;
TRAVERSE
while both have elements
while (i < nums1.length && j < nums2.length) {
while (l1 && l2) {
while (i < arr1.length || j < arr2.length) {
[COMPARE]
take smaller into result
if (nums1[i] <= nums2[j]) result.push(nums1[i++]);
else result.push(nums2[j++]);
if (l1.val <= l2.val) { cur.next = l1; l1 = l1.next; }
else { cur.next = l2; l2 = l2.next; }
if (arr1[i] === arr2[j]) { total = (total + Math.max(sum1, sum2) + arr1[i]) % MOD; sum1 = 0; sum2 = 0; i++; j++; }
else if (arr1[i] < arr2[j]) sum1 += arr1[i++];
else sum2 += arr2[j++];
advance
advance the chosen pointer
cur = cur.next;
drain
append leftovers from non-empty side
while (i < nums1.length) result.push(nums1[i++]);
while (j < nums2.length) result.push(nums2[j++]);
cur.next = l1 !== null ? l1 : l2;
// final segment: max(sum1, sum2) captured after loop
RETURN
merged result
return result;
return dummy.next;
return (total + Math.max(sum1, sum2)) % MOD;