Sie können mit einer Hash-Tabelle starten, Zuordnen eines Listenelements auf einem Paar erste Elemente aus der ersten Liste, zweite Elemente aus der zweiten. Dann sammeln Sie die Elemente:
(defun common-elements (l1 l2 &key (test 'eql))
(let ((ht (make-hash-table :test test)) ret)
(dolist (e l1)
(let ((pair (gethash e ht)))
(if pair
(push e (car pair))
(setf (gethash e ht) (cons (list e) nil)))))
(dolist (e l2)
(let ((pair (gethash e ht)))
(when pair ; no need to store e when it is not in l1
(push e (cdr pair)))))
(maphash (lambda (e pair)
(declare (ignore e))
(when (cdr pair) ; we know (car pair) is non-nil
(setq ret (nconc (car pair) (cdr pair) ret))))
ht)
ret))
(common-elements '(a b c d e a b c) '(a d f g k c c))
==> (A A A C C C C D D)
Beachten Sie, dass die Reihenfolge, in der die Listenelemente zurückgegeben werden, ist nicht definiert.
Von der Stackoverflow-Hilfe: "Fragen, die nach Hausaufgabenhilfe fragen, müssen eine Zusammenfassung der bisherigen Arbeit enthalten, um das Problem zu lösen, und eine Beschreibung der Schwierigkeit, die Sie lösen müssen." –