Computing a map between two lists
GatherBy[Union@Transpose@{L1, L2}, First][[;; , ;; , 2]]
Sort@Thread[L1 -> L2] ~Merge~ Union // Values
{{0}, {2}, {1, 3}, {0}}
After reading Kuba's answer I realize this could also be written:
Values @ Merge[Union @ Thread[L1 -> L2], # &]
With MMA10 this can be done by this code:
DeleteDuplicates /@ GroupBy[Transpose@{L1, L2}, First -> Last]
(*<|1 -> {2}, 2 -> {3, 1}, 3 -> {0}, 0 -> {0}|>*)