Натолкнуться 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)

Наши исследования натолкнулись на непредвиденные трудности.

Раньше это утро я столкнулись с товарищем в мою путю к работе.
Ранее этим утром я столкнулся с товарищем по пути на работу.