Interesting topic. My suggestion would be to use something like the following structure
Create a Search page where you are able to fill in a PhoneNumber. Based on that, you can search your contact data for the PhoneNumber and create Result records for each hit (copying the data and linking it to both search and originating Contact. Let's say you have 3 Results, then you could change the ‘LeadingRecord’ attribute for the “Best” contact to true. This can then also set all the ‘UseThis..’ attributes to true. Then you can eg switch the ‘UseThisName’ attributes to true on the second Result record (setting UseThisName in the Leading Result record to false. etc etc).
When you are done, you can call a microflow that will update the Contact object related to your LeadingRecord and use the values related to the ‘UseThis..’ attributes in the other results to update the contact (eg When UseThisName = true for the second Result, the Name from this record will be pushed to the ‘LeadingRecord’ related Contact)
Then you have to decide what to do with the other Contact records (introduce a deactivated status, or simply delete).
All is getting more complex of course when you have all kind of associated objects to your Contact. Which ones to choose there… But principle could be the same.
Hope this helps.