This type of operation arises quite frequently - here's one way to approach it:
(defun f ( l / a r )
(foreach x (reverse l)
(if (setq a (assoc (car x) r))
(setq r (subst (vl-list* (car x) (cdr x) " & " (cdr a)) a r))
(setq r (cons (list (car x) (cdr x)) r))
)
)
r
)
_$ (f '((1 . "a")(23 . "b")(42 . "c")(1 . "d")(23 . "e")(42 . "f")(42 . "g")))
((1 "a" " & " "d") (23 "b" " & " "e") (42 "c" " & " "f" " & " "g"))