interleave 2链表C ++

时间:2011-05-25 21:13:53

标签: c++ linked-list

我在这里有解决方案代码:

// Pre-condition: The fronts of two linked lists are provided.
// Post-condition: A linked list is returned that is the result of
// interleaving the elements from each provided list. 
// (e.g. {1, 2, 3} & { 4, 5, 6} would return {1, 4, 2, 5, 3, 6}

Node* interleave( Node*& front1, Node*& front2 ) {
    if( !front1 ) return front2;
    if( !front2 ) return front1;

    Node* third = front1->next; //this will become the third element
    Node* fourth = front2->next; // this will be come the fourth element

    front1->next = front2;
    front2->next = third;

    third = interleave(third, fourth);

    return front1;  
}

我有点理解它,但我永远无法想出这样的东西,因为我在递归方面非常糟糕。还有其他方法可以非递归地解决这个问题吗?如果是这样你能给我一个暗示吗?我试过这个:

Node* interleave( Node*& front1, Node*& front2 ) {
    Node* newNode = new Node;
    while(front1!=NULL && front2!=NULL){
        newNode = front1->next;
        newNode = front2->next;
        front1 = front1->next;
        front2 = front2->next;
     }
    return newNode;
}

我确定这是错的,但这是我现在唯一能想到的。请帮忙。谢谢

2 个答案:

答案 0 :(得分:2)

尝试在一张纸上并行绘制两个链接列表。在节点中放一些数字,只是为了区分它们。考虑如何重新连接它们以形成单个列表,从头部(或“前部”)开始并向下工作。请注意,您必须跟踪一些特殊节点,例如结果列表的第一个节点以及其他几个节点。模式应该变得清晰。

(请注意,无需使用new构建新节点。)

答案 1 :(得分:1)

您的代码中存在一些错误:

Node* interleave( Node*& front1, Node*& front2 )

我没有看到需要引用指针,因为front1中的第一项将继续作为第一项,而你根本不需要使用front2。

Node* newNode = new Node;
while(front1!=NULL && front2!=NULL){
    newNode = front1->next;

这导致内存泄漏 - 你至少分配了sizeof(Node)字节,但是你失去了对指针的引用,你将无法再删除它。 此外,你没有对newNode做任何事情,所以你也可以把它扔掉。

front1 = front1->next;
front2 = front2->next;

基本上你告诉front1将指向下一个元素,并且因为你传递了对front1的引用,你正在改变真正的指针。最终,front1或front2将为NULL并且循环将终止,因此两个给定参数中的至少一个将变得无用。你永远不会改变,所以订单将保持不变 - 你只是走过列表。

一种方法可能是将front2的值设置为front1-> next,然后交换指针并再次迭代:

Node *a = front1, *b = front2;
while (a && b) {
    Node* tmp = a->next;
    a->next = b;
    b = tmp;
    a = a->next;
}
return front1;

我没有测试过,但应该接近工作。如果你正在使用stl,你可以用std :: swap()替换详细的交换代码。 这个想法很简单:假设你有两个列表:

A - > B - > C - > NULL
D - > E - > F - > NULL

你说A的下一个项目将是第二个列表中的第一个元素,所以D:

A - > D - > E - > F - > NULL

然后第二个列表成为古代A的继承者,所以只有B - > C - >空值。然后你前进到指向新的下一个,或者D,所以你现在有:

D - > E - > F - > NULL
B - > C - > NULL

你重复一遍:

D - > B - > C - > NULL
E - > F - > NULL

B - > C - > NULL
F - > NULL

等等,直到满足NULL。那么仍然指向A的front1应该有正确的顺序(也就是说,除非我非常错误:p)