【问题标题】:Copy two linked lists recursively by mixing items通过混合项递归复制两个链表
【发布时间】:2012-06-14 22:02:41
【问题描述】:

我需要递归地复制两个链表并返回一个新的list。我需要复制它们的方式是 list1 中的一个元素,list2 中的一个元素。如果一个列表比另一个列表短,只需附加较长列表的剩余元素。

示例输入: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;
    }           
}

有人可以指出我所犯的错误吗?

编辑:现在它可以工作了。我错过了两个返回语句。

【问题讨论】:

  • 它必须是递归的?不能是一个简单的扣环,比如一个 for?

标签: c linked-list


【解决方案1】:

您似乎缺少底部两个 else if 分支中的 return 语句。

【讨论】:

    【解决方案2】:

    您可以通过将所有块放在一个循环中来减少块的数量:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      相关资源
      最近更新 更多