Pictures from the scene in the Puglia region showed both trains were on the same track about 15 kilometers south of the Adriatic Sea, apparently headed toward each other.
Images showed smashed remains of train cars and a large area of scattered metal at the impact site.
According to CNN, one train was headed from Andria to Corato, while the other was headed in the opposite direction, Italian news agency ANSA reported.
An official identified as Giuseppe Corrado said at least 20 people were killed. Italian PM Matteo Renzi has called for an investigation into the collision.
"There will be a full inquiry to find out who is responsible for this crash, and what has happened."