在C++中,用数据结构的方式, 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作为存储结构,请编写算法将A表和B表归并成一个按元素值递减有序,允许表中含有值相同的元素排列的线性表C,并要求利用原表的结点空间构造C表,要求有相同数据的情况下同样适用,给出完整代码
时间: 2024-09-23 18:16:47 浏览: 55
在C++中,我们可以采用归并排序的思想来合并两个已排序的链表,然后逆序遍历生成一个新的递减有序链表。下面是一个简单的示例代码:
```cpp
#include <iostream>
// 定义链表节点结构体
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* mergeTwoLists(ListNode* A, ListNode* B) {
// 如果A或B为空,直接返回另一个
if (!A) return B;
if (!B) return A;
// 创建临时头节点
ListNode dummy(-1);
ListNode* tail = &dummy; // 尾指针
// 比较节点值,较大者添加到新链表
while (A && B) {
if (A->val > B->val) {
tail->next = A;
A = A->next;
} else {
tail->next = B;
B = B->next;
}
tail = tail->next;
}
// 添加剩余的一个链表,如果还有元素
if (A) tail->next = A;
if (B) tail->next = B;
// 由于我们是逆序遍历,所以需要反转新链表
ListNode* prev = NULL;
ListNode* curr = dummy.next;
while (curr) {
ListNode* nextTemp = curr->next;
curr->next = prev;
prev = curr;
curr = nextTemp;
}
return dummy.next; // 返回新的头节点
}
// 测试函数
void printList(ListNode* head) {
while (head) {
std::cout << head->val << " ";
head = head->next;
}
std::cout << std::endl;
}
int main() {
// 构造两个示例链表
ListNode* A = new ListNode(5);
A->next = new ListNode(10);
A->next->next = new ListNode(15);
ListNode* B = new ListNode(4);
B->next = new ListNode(9);
B->next->next = new ListNode(14);
ListNode* C = mergeTwoLists(A, B);
printList(C); // 输出:15 14 10 9 5 4
delete C; // 防止内存泄露
return 0;
}
```
在这个例子中,`mergeTwoLists` 函数接收两个排序链表的头部指针,通过比较节点值合并它们。最后,`printList` 函数用于打印合并后的链表。
阅读全文