2012-06-14 3 views
4

Мне нужно скопировать два связанных списка рекурсивно и вернуть новый list. Способ, которым мне нужно скопировать их, - это один элемент из списка1, один из списка2. Если один список короче другого, просто добавьте оставшиеся элементы более длинного списка.Скопируйте два связанных списка рекурсивно, смешав элементы

Пример ввода: list1 = [1,2,3], list2 = [4,5,6,7]; result = [1,4,2,5,3,6,7];

Вот мой дефектный (теперь правильно) код:

node *copy(node *list1, node *list2) 
{ 
    if (list1 == NULL && list2 == NULL) return NULL; 

    else if (list1 != NULL && list2 != NULL) { 
     node *result; 
     result = newnode(); 

     result->data = list1->data; 
     result->next = newnode(); 
     result->next->data = list2->data; 

     result->next->next = copy(list1->next, list2->next); 

     return result; 
    } 
    else if (list1 != NULL && list2 == NULL) { 
     node *result; 
     result = newnode(); 

     result->data = list1->data; 
     result->next = copy(list1->next, NULL); 

       return result; 
    } 
    else if (list1 == NULL && list2 != NULL) { 
     node *result; 
     result = newnode(); 

     result->data = list2->data; 
     result->next = copy(NULL, list2->next); 

       return result; 
    }   
} 

Может кто-то момент ошибки, которые я делаю?

Редактировать: Теперь это работает. Мне не хватало двух возвратных заявлений.

+0

Это должно быть рекурсивным? не может быть простой куклой, как за? –

ответ

2

Кажется, что у вас нет возвратных операторов в нижних двух остальных ветвях.

0

Вы можете уменьшить количество блоков, поместив все это в одном цикле:

node *copy_two_interlaced(node *list1, node *list2) 
{ 
    node *result=NULL, **pp = &result; 

    while (list1 || list2) { 
     if (list1) { 
     *pp = newnode(); 

     (*pp)->data = list1->data; 
     (*pp)->next = NULL; 
     list1 = list1->next; 
     pp = &(*pp)->next; 
     } 
     if (list2) { 
     *pp = newnode(); 

     (*pp)->data = list2->data; 
     (*pp)->next = NULL; 
     list2 = list2->next; 
     pp = &(*pp)->next; 
     } 
    } 
    return result; 
} 

Ой, извините, это не является рекурсивным. Вот (очень уродливая) рекурсивная версия:

node *copy_two_interlaced_recursive(node *list1, node *list2) 
{ 
    node *result=NULL; 

     if (list1) { 
     result = newnode(); 
     result->data = list1->data; 
     result->next = copy_two_interlaced(list2, list1->next); 
     return result; 
     } 
     if (list2) { 
     result = copy_two_interlaced(list2, NULL); 
     } 
    } 
    return result; 
} 
Смежные вопросы