The two most highly rated free de-duping Apps on the App Exchange are Dupe Catcher and Duplicate Check. Some of the features in the latter are available only in the paid version while everything in Dupe Catcher is completely free.
As part of full disclosure, I'm not financially associated with either company but have met some of the employees of Symphonic Source (makers of Dupe Catcher) as they're local to me. They've presented at the Dallas Developer's User Group on their Cloudingo Studio and likely attend at least some of our meetings. As we now have over 400 members it would be difficult for me to say.
As for "best practices", I think that's a difficult one to answer. Some companies like to merge duplicates while others will archive duplicate contacts and delete duplicate leads. When it comes to leads, which to do might depend on the source of the lead, how complete the info is on one vs another or how highly the one lead was ranked from one source vs the from another source as to what you'd want to do. I'd think you'd need to establish your own criteria, including any differentiation due to product interest, etc. as to how or whether to merge them. I don't think there's a simple answer considering that the process of generating and handling leads can be rather complex in many organizations.
One situation that can come up is where a duplicate contact name gets identified where a contact of the same name is is now with a different company. That's obviously a situation that needs to be handled carefully. Do you archive the contact ID for the name of the person at the previous company they were with or do you merge it with the contact ID where the same person is at a their new position in a different company? As an Account related contact ID, are there Opportunity or other records that need the old contact ID as a reference which might prevent it from being merged if related to a new account? If not, I think that's a decision an Org needs to make for itself. There's another app called Former Positions that might be helpful if you want to keep track of a contact as they move from company to company without losing that history. Again, I think that's a decision an org needs to make based on their particular needs for information and not necessarily one of what's a general best practice.
I hope this response is helpful to you.