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