Update merge/flatten algorithm using recursive approach

Hey @pedronauck I updated the merge/flatten algorithm to recursive approach which re-use the same function to merge/flatten instead of using `forEach`. (This is asked on interviews sometimes)

The `merge/flatten` function shouldn't automatically `sort` and there's no need to check if the item is duplicated or not since it's function job is to just merge/flatten arrays nothing else.

This could be used like a method chaining e.g `flatten(arr).sort().removeDuplicate()`