Given two 1d vectors, implement an iterator to return their elements alternately.
For example, given two 1d vectors:
v1 = [1, 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?
Clarification for the follow up question - Update (2015-09-18):
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,2,3] [4,5,6,7] [8,9]
It should return [1,4,8,2,5,9,3,6,7]
.
1 public class ZigzagIterator { 2 private int index1 = 0, index2 = 0; 3 private List<Integer> l1; 4 private List<Integer> l2; 5 6 public ZigzagIterator(List<Integer> v1, List<Integer> v2) { 7 l1 = v1; 8 l2 = v2; 9 } 10 11 public int next() { 12 if (index1 < l1.size()) { 13 if (index2 < l2.size()) { 14 if (index2 < index1) return l2.get(index2++); 15 } 16 return l1.get(index1++); 17 } else return l2.get(index2++); 18 } 19 20 public boolean hasNext() { 21 return index1 < l1.size() || index2 < l2.size(); 22 } 23 } 24 25 /** 26 * Your ZigzagIterator object will be instantiated and called as such: 27 * ZigzagIterator i = new ZigzagIterator(v1, v2); 28 * while (i.hasNext()) v[f()] = i.next(); 29 */