设计一个有序顺序表,要求: 把有序顺序表L1[3,5,8,11]和L2[2,6,8,9,11,15,20]中的数据元素合并到L3,要求L3中的数据元素依然保持有序。用C++怎么写
时间: 2024-09-26 17:10:20 浏览: 100
为了设计一个将两个有序顺序表 L1 和 L2 合并到一个新的有序顺序表 L3 中的 C++ 程序,我们可以使用双指针法。这里是一个简单的示例:
```cpp
#include <iostream>
// 定义一个结构体或类表示列表的节点
struct ListNode {
int data;
ListNode* next;
ListNode(int value) : data(value), next(nullptr) {}
};
// 合并函数
ListNode* mergeSortedLists(ListNode* list1, ListNode* list2) {
// 初始化头结点和临时指针
ListNode* dummy = new ListNode(0);
ListNode* tail = dummy;
// 指向当前处理的列表
ListNode* current1 = list1;
ListNode* current2 = list2;
// 当两个列表均非空时,比较并添加较小的数据
while (current1 && current2) {
if (current1->data <= current2->data) {
tail->next = current1;
current1 = current1->next;
} else {
tail->next = current2;
current2 = current2->next;
}
tail = tail->next;
}
// 将剩余列表连接到结果
if (current1) {
tail->next = current1;
} else {
tail->next = current2;
}
return dummy->next; // 返回新列表的头结点
}
// 示例输入的列表
int main() {
ListNode* L1 = new ListNode(3); // L1: [3, 5, 8, 11]
L1->next = new ListNode(5);
L1->next->next = new ListNode(8);
L1->next->next->next = new ListNode(11);
ListNode* L2 = new ListNode(2); // L2: [2, 6, 8, 9, 11, 15, 20]
L2->next = new ListNode(6);
L2->next->next = new ListNode(8);
L2->next->next->next = new ListNode(9);
L2->next->next->next->next = new ListNode(11);
L2->next->next->next->next->next = new ListNode(15);
L2->next->next->next->next->next->next = new ListNode(20);
// 合并两个列表
ListNode* L3 = mergeSortedLists(L1, L2);
// 打印结果
ListNode* temp = L3;
while (temp != nullptr) {
std::cout << temp->data << " ";
temp = temp->next;
}
std::cout << std::endl;
// 清理内存
delete temp;
while (L1 != nullptr) {
ListNode* temp = L1;
L1 = L1->next;
delete temp;
}
while (L2 != nullptr) {
ListNode* temp = L2;
L2 = L2->next;
delete temp;
}
return 0;
}
```
这个程序会合并两个有序列表,并返回新的有序列表。在 `main` 函数中,记得最后清理内存,避免内存泄漏。
阅读全文