Pointers 如何将2个已排序的链表递归地合并到一个新的已排序列表中?

Pointers 如何将2个已排序的链表递归地合并到一个新的已排序列表中?,pointers,recursion,linked-list,Pointers,Recursion,Linked List,这是我在这里的第一篇文章。我在递归合并两个链表时遇到问题。很明显,即使经过大量的研究,我对链表/指针的理解也没有达到应有的程度。这很令人沮丧。以下是我的(糟糕的)代码,它不起作用: void SortedMergeRecur(Node*& xHead, Node*& yHead, Node*& zHead){ if (xHead == 0 && yHead == 0){ //empty list return; }

这是我在这里的第一篇文章。我在递归合并两个链表时遇到问题。很明显,即使经过大量的研究,我对链表/指针的理解也没有达到应有的程度。这很令人沮丧。以下是我的(糟糕的)代码,它不起作用:

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

我感到困惑、沮丧和失落。现在非常感谢您的帮助。我理解这样做背后的逻辑,但我不知道如何以需要操纵的方式操纵指针

我明白了。我正在通过函数调用传递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);
        }
    }
}
void SortedMergeRecur(节点*&xHead,节点*&yHead,节点*&zHead){
如果(xHead==0&&yHead==0){//空列表
返回;
}
否则,如果(xHead!=0&&yHead==0){//如果y为空,则将x放入新的
zHead=xHead;
zHead->link=xHead->link;
xHead=xHead->link;
返回已分类的麦格雷库(xHead、yHead、zHead->link);
}
否则如果(xHead==0&&yHead!=0){//如果x为空,则将y放入新的
zHead=yHead;
zHead->link=yHead->link;
yHead=yHead->link;
返回已分类的麦格雷库(xHead、yHead、zHead->link);
}
否则{//niether为空
if(xHead->data){
zHead=xHead;
zHead->link=xHead->link;
xHead=xHead->link;
返回已分类的麦格雷库(xHead、yHead、zHead->link);
}
否则{
zHead=yHead;
zHead->link=yHead->link;
yHead=yHead->link;
返回已分类的麦格雷库(xHead、yHead、zHead->link);
}
}
}

大家好,欢迎来到Stack Overflow。请您详细说明一下
x
y
z
在本文中的含义好吗?我想我知道你所说的参数是什么意思,但由于你故意选择了不透明的名称,我可能弄错了。从我的第一眼看,你似乎选择了X头或Y头,然后在修改X-next点之前修改X点,你确定这些操作是安全的吗?你能详细说明一下你到底想在这里做什么吗?你想用正确的顺序构建一个新的链表,还是想将现有的两个链表合并到这个新的链表中?当然,很抱歉有点不清楚。所以我已经有了一个由我的教授创造的骨架。我需要做的就是在这里创建一个函数(特别是一个void函数),它传递三个列表的头节点(由他命名为xy和z)。z列表总是以空开始,x和y列表正在合并到z列表中,并且应该进行排序。
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);
        }
    }
}