Strategy:
Map each email to an account index
If an email appears in multiple accounts, union those accounts
Collect all emails for each root account
function accountsMerge(accounts):
uf = new UnionFind(accounts.length)
emailToId = {}
// Map emails to account indices
for i from 0 to accounts.length - 1:
account = accounts[i]
for each email in account[1:]:
if email in emailToId:
uf.union(i, emailToId[email])
emailToId[email] = i
// Collect emails by root
rootToEmails = empty map of sets
for each (email, id) in emailToId:
root = uf.find(id)
rootToEmails[root].add(email)
// Build result
result = []
for each (root, emails) in rootToEmails:
name = accounts[root][0]
result.add([name] + sort(emails))
return result