已知两个递增有序的顺序表 La 和 Lb。编写算法将 La 和 Lb 合并成一个递减有序的顺序表,并将合并的结果存放在 La 中(假设表 La 空间足够大,不会溢出)。要求:时间复杂度为O(n)。用c++
时间: 2024-09-23 22:14:29 浏览: 45
要合并两个递增有序的顺序表 La 和 Lb,并将其结果存储在一个递减有序的顺序表 La 中,你可以采用双指针法,同时遍历两个列表,每次从较大的元素开始取值放到 La 的末尾。以下是 C++ 代码实现:
```cpp
#include <iostream>
// 假设 List 指向的结构体包含整数元素,这里简化为 int 类型
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
void mergeDecending(ListNode* &La, const ListNode* Lb) {
// 如果 Lb 为空,则直接复制 La 到 La
if (!Lb) {
return;
}
// 使用两个临时指针指向 La 和 Lb 的当前节点
ListNode* la = La;
ListNode* lb = Lb;
// 另外一个临时指针用于插入到 La 的末尾
ListNode* tail = La;
while (la && lb) {
// 如果 La 的当前元素小于 Lb,说明 Lb 应该先添加到 La
if (la->val > lb->val) {
// 将 Lb 的节点加入 La 并更新指针
tail->next = lb;
tail = tail->next;
lb = lb->next;
} else {
// 否则,La 的节点保持不变
la = la->next;
}
}
// 如果 Lb 还有剩余元素,将其全部添加到 La
while (lb) {
tail->next = lb;
tail = tail->next;
lb = lb->next;
}
}
// 示例如何创建和初始化 List 节点
int main() {
ListNode* La = new ListNode(5); // La 初始化为 [5]
La->next = new ListNode(7); // La 添加 [5, 7]
ListNode* Lb = new ListNode(4); // Lb 初始化为 [4]
Lb->next = new ListNode(6); // Lb 添加 [4, 6]
mergeDecending(La, Lb); // 合并后 La 变为 [7, 6, 5, 4]
// 打印合并后的 La
while (La) {
std::cout << La->val << " ";
La = La->next;
}
std::cout << "\n";
// 清理内存
delete La->next; // 删除最后一个节点的指针
delete La;
delete Lb->next;
delete Lb;
return 0;
}
```
阅读全文