如何将2个排序的链接列表递归合并到新的排序列表中?

时间:2018-07-28 19:56:01

标签: pointers recursion linked-list

所以这是我在这里的第一篇文章。我在递归地合并两个链表时遇到麻烦。很明显,即使经过大量研究,我对链接列表/指针的理解也不尽如人意。非常令人沮丧。这是我的(糟糕的)代码,不起作用:

void SortedMergeRecur(Node*& xHead, Node*& yHead, Node*& zHead){

    if (xHead == 0 && yHead == 0){ //empty list
        return;
    }

    else if (xHead != 0 && yHead == 0){ //if y empty, put x into new
        zHead = xHead;
        zHead->link = xHead->link;
        return SortedMergeRecur(xHead->link, yHead, zHead->link);
    }

    else if (xHead == 0 && yHead != 0){ //if x empty, put y into new
        zHead = yHead;
        zHead->link = yHead->link;
        return SortedMergeRecur(xHead, yHead->link, zHead->link);
    }

    else { //niether empty
        if (xHead->data <= yHead->data){
            zHead = xHead;
            zHead = zHead->link;
            zHead->data = yHead->link->data;
            zHead = zHead->link;
            return SortedMergeRecur(xHead->link, yHead->link, zHead);
        }

        else {
            zHead = yHead;
            zHead = zHead->link;
            zHead->data = xHead->link->data;
            zHead = zHead->link;
            return SortedMergeRecur(xHead->link, yHead->link, zHead);
        }
    }
}

链接列表定义为此结构:

struct Node
{
   int data;
   Node *link;
};

我感到困惑,沮丧和迷茫。帮助将不胜感激。我了解执行此操作背后的逻辑,但是我不知道如何以需要操纵指针的方式操纵指针。

1 个答案:

答案 0 :(得分:0)

我知道了。我通过函数调用传递xHead-> link或yHead-> link(需要使用的那个),然后递增zHead = zHead-> link……我不知道为什么现在可以使用,但是是的。

void SortedMergeRecur(Node*& xHead, Node*& yHead, Node*& zHead){
    if (xHead == 0 && yHead == 0){ //empty lists
        return;
    }

    else if (xHead != 0 && yHead == 0){ //if y empty, put x into new
        zHead = xHead;
        zHead->link = xHead->link;
        xHead = xHead->link;
        return SortedMergeRecur(xHead, yHead, zHead->link);
    }

    else if (xHead == 0 && yHead != 0){ //if x empty, put y into new
        zHead = yHead;
        zHead->link = yHead->link;
        yHead = yHead->link;
        return SortedMergeRecur(xHead, yHead, zHead->link);
    }

    else { //niether empty
        if (xHead->data <= yHead->data){
            zHead = xHead;
            zHead->link = xHead->link;
            xHead = xHead->link;
            return SortedMergeRecur(xHead, yHead, zHead->link);
        }
        else {
            zHead = yHead;
            zHead->link = yHead->link;
            yHead = yHead->link;
            return SortedMergeRecur(xHead, yHead, zHead->link);
        }
    }
}