I think you can utilize ArcGIS to solve you issue, as it has a tool named Snap which would take into consideration of your input layer and reference layers and would move only the input layer on the basis of tolerance provided.
With this tool you will have to provide an input layer and a reference layer on the basis of which you can move the input layer. In the you will have option to choose whether to snap on the vertex, End Point or Edge, Just make sure you have a copy of the layer as it actually alters the Original layer, Please keep the Tolerance level low as you don't want to distort the data.