Turing machine algorithms for $\{0^n1^n\}$ using one and two tapes
If you are allowed an auxiliary tape, then the algorithm is very simple:


Scan to the end of the input, while checking that the input belongs to $0^*1^*$.
Copy the input in reverse to the auxiliary tape, switching 0s and 1s.
Check that both tapes contain the same word.


If the input is $0^a 1^b$ then the second tape will contain $0^b 1^a$, so the algorithm will accept if and only if $a = b$. It clearly runs in linear time.

If you only have one tape, then the algorithm is more subtle. We scan the input from left-to-right, maintaining a counter just left of the current symbol being scanned. At each step, we do as follows:


Read the next symbol $\sigma$ and remember it.
Copy the counter one step to the right; this step takes $O(\log n)$ time.
Either increment the counter (if $\sigma = 0$) or decrement it (if $\sigma = 1$).


At the end, we accept if the input belongs to $0^*1^*$, and additionally the counter has the value zero.

Using crossing sequences, you should be able to show a matching $\Omega(n \log n)$ lower bound for one-tape Turing machines. The idea is to consider the set of inputs $0^m1^m,\ldots,0^{2m}1^{2m}$, and to consider the states that the Turing machine is when it crosses the window between the $m$th and $2m$th position. There must be $m+1$ different crossing sequences, hence there must exist a crossing sequence of length $\log m$, which corresponds to a running time of $\Omega(m\log m) = \Omega(n\log n)$.