将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间,不另占用其他的存储空间。表中允许有重复的数据。 使用完整的C++程序编写
时间: 2024-09-30 10:04:36 浏览: 45
将两个非递减的有序链表合并成一个非递增有序链表的问题可以使用归并排序的思想来解决。这里是一个简单的C++程序示例:
```cpp
#include <iostream>
using namespace std;
// 链表节点结构体
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
// 如果其中一个列表为空,直接返回另一个
if (!l1) return l2;
if (!l2) return l1;
// 创建一个新的头结点
ListNode* dummy = new ListNode(0);
ListNode* tail = dummy;
// 比较两个链表的当前元素,选择较小的一个添加到新链表
while (l1 && l2) {
if (l1->val <= l2->val) {
tail->next = l1;
l1 = l1->next;
} else {
tail->next = l2;
l2 = l2->next;
}
tail = tail->next; // 移动tail指针
}
// 添加剩余的链表元素
if (l1) tail->next = l1;
if (l2) tail->next = l2;
// 返回新链表的头部
return dummy->next;
}
int main() {
// 这里仅作为演示,实际应用需要提供两个已排序的链表实例
ListNode* list1 = new ListNode(1);
list1->next = new ListNode(4);
list1->next->next = new ListNode(5);
ListNode* list2 = new ListNode(1);
list2->next = new ListNode(3);
list2->next->next = new ListNode(4);
ListNode* mergedList = mergeTwoLists(list1, list2);
// 打印合并后的链表
while (mergedList) {
cout << mergedList->val << " ";
mergedList = mergedList->next;
}
cout << endl;
// 别忘了释放内存
delete mergedList;
return 0;
}
```
阅读全文