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

For example, given two 1d vectors:

1
2
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
[1,2,3]
[4,5,6,7]
[8,9]

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


直接做Follow Up吧。也比较简单,但是直接在Queue里面放Iterator的做法还是没有想到。

下面是我找到的比较好的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class ZigzagIterator {
Queue<Iterator> q;
public ZigzagIterator(List<Integer> v1, List<Integer> v2) {
q = new LinkedList();
if (!v1.isEmpty()) q.offer(v1.iterator());
if (!v2.isEmpty()) q.offer(v2.iterator());
}
public int next() {
Iterator cur = q.poll();
int res = (int) cur.next();
if (cur.hasNext()) q.offer(cur);
return res;
}
public boolean hasNext() {
return !q.isEmpty();
}
}

这是我自己的做法,比较慢:

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
public class ZigzagIterator {
Queue<Integer> q = new LinkedList<>();
public ZigzagIterator(List<Integer> v1, List<Integer> v2) {
List<List<Integer>> list = new ArrayList<>();
list.add(v1);
list.add(v2);
for (int i = 0; list.size() != 0; i++) {
Iterator<List<Integer>> iter = list.iterator();
while (iter.hasNext()) {
List<Integer> v = iter.next();
if (v.size() <= i)
iter.remove();
else
q.add(v.get(i));
}
}
}
public int next() {
return q.poll();
}
public boolean hasNext() {
return !q.isEmpty();
}
}

Ref:

  1. https://discuss.leetcode.com/topic/26654/simple-java-solution-for-k-vector/2
  2. https://discuss.leetcode.com/topic/24231/short-java-o-1-space