I think that there were a bunch of solutions given that don't quite work. Among them were simply copying the extra element down, and comparing the last element with the first. These should both break on this example. Try your method on it, and see how it works.
The example: 3,3,3,2,2,2,2,2,2,2,3,3,3
Note: A simple sniff test can tell you that it can't work in O(log n) time, since we can't even look at all the elements in O(log n) time.
We keep an index into the array that begins at the first element. As we progress down the pairs, if we find a matching pair, we swap that element with the element under our index and increment the index. After we've traversed the array, we then recurse on the portion of the array that lies before the index. In this way, we keep the "interesting" portion of the list at the front of the array, and never have to actually delete anything.
Solution by Isaac Kunen, 10.4.2000