将两个列表合并为一个列表Racket

时间:2015-02-02 11:15:15

标签: list recursion compare racket

我有一个问题:

我有两个数字列表例如(list1 3 6 7)和(list2 1 6 4 7)。现在我必须将两者结合起来(list3 1 3 4)。所以6和7都在list1和list2中。 List3包含仅出现一次的所有数字。我希望你明白我的意思,不仅仅是问我:s! 这是我的开始:

(define (diff list1 list2)
  (cond
    [(empty? list1) list2] ;; If list1 was empty return directly list2
    [(empty? list2) list1] ;; If list2 was empty return directly list1
    [else
      (???

我知道我必须将第一个list1与list2中的每个数字进行比较然后再次进行recursiv。但我该如何编程呢?

1 个答案:

答案 0 :(得分:0)

这是一个不同的,希望不那么棘手的实现。 (它是O(n),但它需要对两个传入列表进行排序;相比之下,Óscar的实现不需要排序列表,但它是O(n²)。)

(define (diff lhs rhs)
  (let loop ((result '())
             (lhs lhs)
             (rhs rhs))
    (cond ((null? lhs) (append-reverse result rhs))
          ((null? rhs) (append-reverse result lhs))
          (else (let ((a (car lhs))
                      (b (car rhs)))
                  (cond ((< a b) (loop (cons a result) (cdr lhs) rhs))
                        ((< b a) (loop (cons b result) lhs (cdr rhs)))
                        (else (loop result (cdr lhs) (cdr rhs)))))))))

示例:

> (diff '(3 6 7) '(1 4 6 7))
(1 3 4)

append-reverse来自SRFI 1,因此在Racket中您必须(require srfi/1)