How to Merge Two List/Iterators in Java?

  • Time:2020-09-09 14:04:20
  • Class:Weblog
  • Read:40

We have known the approach to merge two linked list in C++. We also know how to apply the merge sort algorithms to merge K sorted list. If you are given two Iterators in Java, how are you supposed to merge them into one list if both iterators are sorted?

The Java’s iterator has two important methods you can use: hasNext() and next(). The hasNext() returns a boolean telling if this iterator reaches the end. And the next() will advance to next position and returns the value of it. It will throw exception if the iterator is beyond the end (EOF).

Merging Two Sorted Iterators in Java

Remember, everytime we call next() we have to put a safety check hasNext(). Then the logic is pretty simple: we first deal with the merging when both iterators are not NULL.

Then, we have to follow the remaining iterator and copy over the values.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package helloacm.com
import lombok.var;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
 
public class Main {
    public static List<Integer> merge(Iterator<Integer> it1, Iterator<Integer> it2) {
        List<Integer> res = new ArrayList<>();
        var v1 = it1.hasNext() ? it1.next() : null;
        var v2 = it2.hasNext() ? it2.next() : null;
        while (v1 != null && v2 != null) {
            if (v1 < v2) { // pick the smaller one
                res.add(v1);
                v1 = it1.hasNext() ? it1.next() : null;
            } else {
                res.add(v2);
                v2 = it2.hasNext() ? it2.next() : null;
            }
        }
        while (v1 != null) {
            res.add(v1);
            v1 = it1.hasNext() ? it1.next() : null;
        }
        while (v2 != null) {
            res.add(v2);
            v2 = it2.hasNext() ? it2.next() : null;
        }
        return res;
    }
 
    public static void main(String[] args) {
        var l1 = Arrays.asList(1, 3, 5, 7, 9, 11, 15, 17);
        var l2 = Arrays.asList(2, 4, 6, 8, 10, 12, 16, 18);
        var sorted = merge(l1.iterator(), l2.iterator());
        for (var num: sorted) {
            System.out.println(num);
        }
    }
}
package helloacm.com
import lombok.var;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class Main {
    public static List<Integer> merge(Iterator<Integer> it1, Iterator<Integer> it2) {
        List<Integer> res = new ArrayList<>();
        var v1 = it1.hasNext() ? it1.next() : null;
        var v2 = it2.hasNext() ? it2.next() : null;
        while (v1 != null && v2 != null) {
            if (v1 < v2) { // pick the smaller one
                res.add(v1);
                v1 = it1.hasNext() ? it1.next() : null;
            } else {
                res.add(v2);
                v2 = it2.hasNext() ? it2.next() : null;
            }
        }
        while (v1 != null) {
            res.add(v1);
            v1 = it1.hasNext() ? it1.next() : null;
        }
        while (v2 != null) {
            res.add(v2);
            v2 = it2.hasNext() ? it2.next() : null;
        }
        return res;
    }

    public static void main(String[] args) {
        var l1 = Arrays.asList(1, 3, 5, 7, 9, 11, 15, 17);
        var l2 = Arrays.asList(2, 4, 6, 8, 10, 12, 16, 18);
        var sorted = merge(l1.iterator(), l2.iterator());
        for (var num: sorted) {
            System.out.println(num);
        }
    }
}

Unlike linked lists, for iterators, you have to iterate and copy over the values. With linked list, you can just re-point/re-connect the head with O(1) constant time.

The runtime complexity is O(M+N) where M and N are the number of the elements in each iterator respectively. The space requirement is also O(M+N).

–EOF (The Ultimate Computing & Technology Blog) —

Recommend:
The Contiguous Binary Array with Equal Numbers of Ones and Zeros
Microbit Programming: Showing a Running Pixel on the LED
How to Print Immutable Linked List in Reverse using Recursion or
The Most Useful Tools for Reverse Phone Lookup
How to Solve the WIFI (Wireless Networks) Intermittency Issues?
How to Reverse a Linked List in Javascript?
Bash Function to Check if a Kubernetes Pod Name is Valid
VBScript Function to Convert an Integer to Binary String Represe
Find Maximum Connected Colors (Values) in a 2D Grid using DFS or
Algorithms to Shift a 2D Grid/Matrix In-Place
Share:Facebook Twitter
Comment list
Comment add