我需要递归复制两个链接列表并返回一个新的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;
}
}
有人指出我正在犯的错误吗?
编辑:现在可以了。我错过了两个回复陈述。
答案 0 :(得分:2)
如果分支,你似乎在底部的两个缺少返回语句。
答案 1 :(得分: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;
}