将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间,不另占用其他的存储空间。表中允许有重复的数据。 使用完整的C++程序编写(首先创建两个链表,再进行合并排序)
时间: 2024-09-30 17:04:38 浏览: 33
为了将两个非递减的有序链表合并成一个非递增的有序链表,我们可以采用双指针法,同时遍历两个输入链表。这里是一个简单的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; // 如果l1为空,直接返回l2
if (!l2) return l1; // 如果l2为空,直接返回l1
// 创建一个新的头节点,初始指向NULL
ListNode dummy(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;
}
// 如果其中一个链表还有剩余元素,将其连接到新链表的末尾
if (l1) tail->next = l1;
if (l2) tail->next = l2;
return dummy.next; // 返回新的头节点
}
int main() {
// 示例:创建两个已排序链表
ListNode* list1 = new ListNode(1); // 1 -> 4 -> 5
list1->next = new ListNode(4);
list1->next->next = new ListNode(5);
ListNode* list2 = new ListNode(2); // 2 -> 6
list2->next = new ListNode(6);
// 合并链表
ListNode* mergedList = mergeTwoLists(list1, list2);
// 打印合并后的链表(假设输出函数)
printLinkedList(mergedList); // 假设有一个printLinkedList函数用于打印链表
return 0;
}
```
在这个例子中,我们首先创建了两个已排序的链表`list1`和`list2`,然后通过`mergeTwoLists`函数合并它们。合并过程中,我们始终将较小的节点添加到新链表上。最后,`dummy.next`就是合并后的非递减有序链表。
阅读全文