合并两个排序的链表
Merge two sorted 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->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;
我明白了,当headA->data < headB->data
然后我们只需将 headA 指针移动到下一个节点。但是当headA->data > headB->data
时,我们创建一个临时指针,将其指向 headA 指向的位置,并将 headB 移动到下一个节点。我没有得到的是:
以前排序的节点如何链接到我创建的这个新的临时节点?你能在我的代码上指出来吗
另外,在第二个条件之后,headA 指针指向哪里?它指向新节点吗?
该代码有效地将 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;
}
并保持简单和对称。
您还可以将前三种情况简化为以下两种情况:
if(headA == NULL)
return headB;
if(headB == NULL)
return headA;
这也可以在没有递归的情况下完成:
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;
}
相关文章:
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- 合并两个排序链表时运行时出错
- 在 C++ 中合并两个排序链表
- 在排序链表中插入结构并将其写入二进制文件
- C++:按数字排序链表错误
- 家庭作业的排序链表程序中的分段错误
- 删除已排序链表中的值
- 排序链表-移动节点还是交换数据成员
- 单排序链表-无限循环
- 插入排序链表c++
- 冒泡排序链表C++
- 将元素添加到排序链表C++时出现问题
- 升序排序 - 链表
- 气泡排序链表不排序
- C++ 中的排序链表不会插入
- 删除具有重复相同值的已排序链表中的重复值
- 未排序链表实现检查完毕
- 插入排序链表c++
- c++中从排序链表中删除重复值节点的方法
- 排序链表和addSorted函数问题