假设有两个按元素值递增有序排列的线性表A和B,均以单链表作为存储结构,请使用C++编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原表(即A表和B表)的结点空间构造C表。
时间: 2024-09-14 20:16:58 浏览: 54
为了合并两个按元素值递增有序排列的链表A和B,并按照元素值递减排序,我们可以创建一个新的链表C,并通过遍历两个输入链表的方式来构建。这里是一个简单的C++实现:
```cpp
#include <iostream>
// 链表节点定义
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
// 归并函数,接受两个链表头指针,返回合并后的链表头指针
ListNode* mergeLists(ListNode* A, ListNode* B) {
// 创建新链表头节点
ListNode* C = nullptr; // 当前C链表节点
ListNode* tail = nullptr; // C链表的尾部
// 比较当前节点值,较大的加到结果链表中
while (A != nullptr && B != nullptr) {
if (A->val > B->val) {
if (C == nullptr) { // 如果C为空,直接添加A
C = A;
tail = C;
} else {
tail->next = A;
tail = tail->next;
}
A = A->next;
} else {
if (C == nullptr) { // 同理,如果C为空,添加B
C = B;
tail = C;
} else {
tail->next = B;
tail = tail->next;
}
B = B->next;
}
}
// 将剩余未处理的部分(若有)添加到结果链表
if (A != nullptr) {
tail->next = A;
} else {
tail->next = B;
}
return C; // 返回合并后链表的头节点
}
int main() {
// 初始化示例链表
ListNode* A = new ListNode(4);
ListNode* B = new ListNode(2);
ListNode* C = new ListNode(1);
A->next = C;
B->next = nullptr;
ListNode* result = mergeLists(A, B);
// 打印合并后的链表(仅用于演示,实际应用不需要)
while (result != nullptr) {
std::cout << result->val << " ";
result = result->next;
}
std::cout << "\n";
return 0;
}
```
在这个代码中,我们首先创建了两个临时变量`C`和`tail`,分别代表新的合并链表和它的尾部。然后,我们在循环中比较`A`和`B`的节点值,较大者添加到`C`。最后返回合并后的链表头节点。
阅读全文