-PhantomX-, ну, роди алгоритм, что ты не как дома.
как мне представляется сейчас - создай класс, в нём реализуй хранилище в виде леса, то есть списка деревьев. в этот класс зафигачь метод добавления пары (файл, корневая папка), в котором будет происходить добавление ещё одного дерева в общий список. дерево, соответственно, из двух элементов. плюс реализовываешь процедуру, которая проверяет все деревья в лесу на то, что корневой элемент дерева содержится в другом дереве из леса, в этом случае ты перекидываешь это дерево в другое, в котором элемент встретился.
поясняю на примере.
Скрытый текст:
у тебя подаются пары (для простоты вместо имён каталогов и файлов - просто числа):
(1, 4), (3, 4), (2, 3)
сначала лес пустой.
потом лес [(4 -> 1)]
потом лес [(4 -> 1), (4 -> 3)]. во втором дереве корневой элемент 4 встретился в первом дереве (или наоборот) - в любом случае, ты объединяешь два дерева и получаешь лес [(4 -> 1, 3)].
потом лес [(4 -> 1, 3), (3 -> 2)]. корневой элемент второго дерева 3 встретился в первом дереве. объединяешь и получаешь лес [(4 -> 1, (3 -> 2))]. единственное дерево, оригинальная структура восстановлена.