用c++写一个程序,将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个表的存储空间,不另外占用其他的存储空间。表中不允许有重复的数据
时间: 2024-10-07 21:03:53 浏览: 29
在C++中,我们可以创建一个函数来合并两个递增有序的链表。这里我们假设链表节点结构包含一个整数值和指向下一个节点的指针。由于题目要求不额外分配存储空间,我们需要利用两个链表的现有节点,删除重复元素并保持排序。
```cpp
#include <iostream>
// 链表节点定义
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
// 如果l1为空,直接返回l2
if (!l1) return l2;
// 如果l2为空,直接返回l1
if (!l2) return l1;
// 初始化结果链表头指针
ListNode* head = nullptr;
ListNode* tail = l1;
// 比较两个链表节点的值,选择较小的添加到结果链表,并移动相应的指针
while (l1 && l2) {
if (l1->val <= l2->val) {
if (!head) {
head = tail = l1;
} else {
tail->next = l1;
tail = l1;
}
l1 = l1->next;
} else {
if (!head) {
head = tail = l2;
} else {
tail->next = l2;
tail = l2;
}
l2 = l2->next;
}
}
// 将剩余未遍历完的链表添加到结果链表
if (l1) tail->next = l1;
else tail->next = l2;
return head;
}
// 测试函数
void printList(ListNode* head) {
ListNode* temp = head;
while (temp) {
std::cout << temp->val << " ";
temp = temp->next;
}
std::cout << std::endl;
}
int main() {
// 创建示例链表
ListNode* l1 = new ListNode(1);
l1->next = new ListNode(2);
l1->next->next = new ListNode(4);
ListNode* l2 = new ListNode(1);
l2->next = new ListNode(3);
l2->next->next = new ListNode(4);
l2->next->next->next = new ListNode(5);
// 合并链表
ListNode* mergedHead = mergeTwoLists(l1, l2);
// 打印合并后的链表
printList(mergedHead);
// 清理内存
delete l1;
delete l2;
// 省略清理 mergedHead,因为我们不需要它
return 0;
}
```
当你运行这个程序,会输出合并后的有序链表:`1 1 2 3 4 4 5`。注意,`main` 函数里的链表创建、合并和打印只是为了测试,实际应用中不需要手动创建链表,可以在函数外部作为输入参数传递。
阅读全文