C++ 合并两个排序的链表

C++ 合并两个排序的链表,c++,c,algorithm,data-structures,linked-list,C++,C,Algorithm,Data Structures,Linked List,我对这个问题有疑问:我遵循这个解决方案: if((headA==NULL)&&(headB==NULL) return NULL; if((headA!=NULL)&&(headB==NULL)) return headA; if((headA == NULL)&&(headB!=NULL)) return headB; if(headA->data < headB->data) headA->

我对这个问题有疑问:我遵循这个解决方案:

if((headA==NULL)&&(headB==NULL)
    return NULL;
if((headA!=NULL)&&(headB==NULL))
    return headA;
if((headA == NULL)&&(headB!=NULL))
    return headB;
if(headA->data < headB->data)
    headA->next = MergeLists(headA->next, headB);
else if(headA->data > headB->data)
{
    Node* temp = headB;
    headB = headB->next;
    temp->next = headA;
    headA = temp;
    headA->next = MergeLists(headA->next, headB);
}
return headA;
if((headA==NULL)和&(headB==NULL)
返回NULL;
如果((headA!=NULL)和&(headB==NULL))
返回headA;
如果((headA==NULL)和&(headB!=NULL))
返回头B;
if(headA->datadata)
headA->next=合并列表(headA->next,headB);
否则如果(头A->数据>头B->数据)
{
节点*temp=headB;
headB=headB->next;
温度->下一步=头A;
headA=温度;
headA->next=合并列表(headA->next,headB);
}
返回headA;
headA->datadata
时,我们只需将headA指针移动到下一个节点。但当
headA->data>headB->data
时,我们创建一个临时指针,将其指向headA指向的位置并将headB移动到下一个节点。我没有得到的是:

  • 以前排序的节点是如何链接到我创建的这个新临时节点的?你能在我的代码中指出它吗

  • 另外,在第二个条件之后,指针指向哪里?它是否指向新节点


  • 代码有效地将head元素从列表B移动到列表A

    Node* temp = headB;
    headB = headB->next;
    
    temp
    指向列表B的头部,
    headB
    指向列表B的尾部。实际上,列表B的头部已从列表中弹出

    temp->next = headA;
    
    列表A现在附加到弹出的头部

    headA = temp;
    
    列表A现在被设置为列表,列表B中的原始标题后面跟着原始列表A

    然后,合并就像列表A有较小的头一样进行,因为列表B中的下一个元素不能小于它,所以它现在这样做了

    此代码无法处理两个列表具有相同头部数据值的情况。在这种情况下,它只返回列表A,而不合并尾部

    不知道为什么不能在最后两种情况下这样做:

    if(headA->data < headB->data) {
        headA->next = MergeLists(headA->next, headB);
        return headA;
    }
    else {
        headB->next = MergeLists(headA, headB->next);
        return headB;
    }
    
    这也可以在没有递归的情况下完成:

    Node *merge_lists(Node *headA, Node *headB)
    {
        Node *head;
        Node **nextPtr = &head;
    
        while (headA && headB) {
            Node **headMin = (headA->data < headB->data) ? &headA : &headB;
            *nextPtr = *headMin;
            nextPtr = &(*headMin)->next;
            *headMin = *nextPtr;
        }
    
        *nextPtr = headA ? headA : headB;
        return head;
    }
    
    Node*merge_列表(Node*headA,Node*headB)
    {
    节点*头;
    节点**nextPtr=&head;
    while(头A和头B){
    节点**headMin=(headA->datadata)?&headA:&headB;
    *NEXTPTTR=*人头分钟数;
    NEXTPTTR=&(*headMin)->下一步;
    *headMin=*nextPtr;
    }
    *NEXTPTTR=headA?headA:headB;
    回流头;
    }
    
    如果您使用调试器单步执行代码,它将准确地显示正在发生的事情,并在发生时显示所有内容的值。如果列表具有公共数据值,则此操作无效。请尝试将列表与同一列表的副本合并。所示代码中至少缺少一个
    。此函数是递归函数,但不是尾部递归。给定一对足够长的列表,它将失败(堆栈溢出!)。
    Node *merge_lists(Node *headA, Node *headB)
    {
        Node *head;
        Node **nextPtr = &head;
    
        while (headA && headB) {
            Node **headMin = (headA->data < headB->data) ? &headA : &headB;
            *nextPtr = *headMin;
            nextPtr = &(*headMin)->next;
            *headMin = *nextPtr;
        }
    
        *nextPtr = headA ? headA : headB;
        return head;
    }