Натолкнуться expresses idea of "unidirectional" strike, and столкнуться expresses idea of "bidirectional", mutual strike.
Also, натолкнуться seems to be a more "unexpected" action than столкнуться is. You can столнуться с чем-то intentionally or by accident, but натолкнуться на что-то only by accident (or due to someone else's intention).
So:
Я столкнулся с приятелем. — столкнуться, because this is a mutual action. If я столкнулся с приятелем, приятель столкнулся со мной too.
Я натолкнулся на стол. — натолкнуться, because стол cannot натолкнуться на меня, it is a passive object and cannot move or feel.
В темноте я натолкнулся на какого-то человека. — this most likely means that какой-то человек was standing in place, and the speaker ran into him/her as if that person were a passive object. Also, this can be used to emphasize that we view on the situation only from one side.
Две машины столкнулись у перекрёстка. (Машина столкнулась с машиной -> Две машины столкнулись.)
Натолкнуться на идею. But not *столкнуться с идеей.
Натолкнуться на засаду. But not *столкнуться с засадой.
Натолкнуться на сопротивление. (unexpectedly)
Столкнуться с сопротивлением. (as an expected event or an intentional action)
Натолкнуться на силы противника. (unexpectedly)
Столкнуться с силами противника. (as an expected event or an intentional action)
Наши исследования натолкнулись на непредвиденные трудности.
Ранее этим утром я столкнулся с товарищем по пути на работу.Раньше это утро я столкнулись с товарищем в мою путю к работе.