Zigzag Iterator

Given two 1d vectors, implement an iterator to return their elements alternately.

For example, given two 1d vectors:

  1. v1 = [1, 2]
  2. v2 = [3, 4, 5, 6]

By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1, 3, 2, 4, 5, 6].

Follow up: What if you are given k 1d vectors? How well can your code be extended to such cases?

The “Zigzag” order is not clearly defined and is ambiguous for k > 2 cases. If “Zigzag” does not look right to you, replace “Zigzag” with “Cyclic”. For example, given the following input:

  1. [1,2,3]
  2. [4,5,6,7]
  3. [8,9]

It should return [1,4,8,2,5,9,3,6,7].

Solution:

  1. public class ZigzagIterator {
  2. int i1 = 0;
  3. int i2 = 0;
  4. boolean flag = false;
  5. List<Integer> l1;
  6. List<Integer> l2;
  7. public ZigzagIterator(List<Integer> v1, List<Integer> v2) {
  8. l1 = v1;
  9. l2 = v2;
  10. }
  11. public int next() {
  12. flag = !flag;
  13. if (i1 < l1.size() && (flag || i2 >= l2.size()))
  14. return l1.get(i1++);
  15. if (i2 < l2.size() && (!flag || i1 >= l1.size()))
  16. return l2.get(i2++);
  17. return -1;
  18. }
  19. public boolean hasNext() {
  20. return i1 < l1.size() || i2 < l2.size();
  21. }
  22. }
  23. /**
  24. * Your ZigzagIterator object will be instantiated and called as such:
  25. * ZigzagIterator i = new ZigzagIterator(v1, v2);
  26. * while (i.hasNext()) v[f()] = i.next();
  27. */