[guided]We want to convert two one-sided-error algorithms into one zero-error algorithm. The one-sided property is the key: an acceptance by the $RP$ algorithm for $L$ is a certificate that the input is in $L$, because that algorithm never accepts inputs outside $L$. Similarly, an acceptance by the $RP$ algorithm for $\overline{L}$ is a certificate that the input is not in $L$.
Since $L \in RP$, choose a randomized algorithm $M_1$ and a polynomial
\begin{align*}
q_1: \mathbb{N} \to \mathbb{N}
\end{align*}
such that, for every input $x$ of length $n$, $M_1$ halts within $q_1(n)$ steps, accepts with probability at least $1/2$ if $x \in L$, and accepts with probability $0$ if $x \notin L$. Since $L \in coRP$, the complement $\overline{L}$ is in $RP$. Therefore choose a randomized algorithm $M_0$ and a polynomial
\begin{align*}
q_0: \mathbb{N} \to \mathbb{N}
\end{align*}
such that, for every input $x$ of length $n$, $M_0$ halts within $q_0(n)$ steps, accepts with probability at least $1/2$ if $x \notin L$, and accepts with probability $0$ if $x \in L$.
Now define the zero-error algorithm $A$. On input $x$, it runs repeated independent rounds. In each round it runs $M_1$ on $x$ with fresh random bits and runs $M_0$ on $x$ with fresh random bits. If $M_1$ accepts, $A$ outputs yes. If $M_1$ does not accept and $M_0$ accepts, $A$ outputs no. If neither machine accepts, $A$ repeats the round.
Why is this zero-error? If $x \in L$, then $M_0$ is being run on an input outside $\overline{L}$, so the one-sided-error guarantee for $M_0$ says that $M_0$ accepts with probability $0$. Thus $A$ cannot output no. In the same case, $M_1$ accepts with probability at least $1/2$, so each round halts with the correct answer yes with probability at least $1/2$. If $x \notin L$, the symmetric statement holds: $M_1$ accepts with probability $0$, while $M_0$ accepts with probability at least $1/2$, so $A$ cannot output yes and each round halts with the correct answer no with probability at least $1/2$.
Let $N_x: \Omega \to \mathbb{N}$ be the random variable giving the number of rounds used by $A$ on input $x$, where $\Omega$ is the probability space of all random bit sequences used in the repeated simulations. Because fresh independent random bits are used in every round, the probability of failing to halt for $k$ consecutive rounds is at most $(1/2)^k$. Therefore, for every integer $k \geq 0$,
\begin{align*}
\mathbb{P}(N_x > k) \leq 2^{-k}.
\end{align*}
For a non-negative integer-valued random variable, the elementary tail formula says that the expectation is the sum of its tail probabilities. Here this follows from the pointwise identity $N_x = \sum_{k=0}^{\infty} \mathbb{1}_{\{N_x > k\}}$ and taking expectations. Applying this identity to $N_x$ gives
\begin{align*}
\mathbb{E}[N_x] = \sum_{k=0}^{\infty} \mathbb{P}(N_x > k).
\end{align*}
Using the bound on the tail probabilities gives
\begin{align*}
\mathbb{E}[N_x] \leq \sum_{k=0}^{\infty} 2^{-k} = 2.
\end{align*}
Finally, each round takes at most $q_1(n) + q_0(n)$ steps on an input of length $n$. Hence the expected running time of $A$ is at most
\begin{align*}
2(q_1(n) + q_0(n)).
\end{align*}
This is a polynomial in $n$. The algorithm $A$ has zero error and expected polynomial running time, so $L \in ZPP$.[/guided]