将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据。c++
时间: 2024-10-26 20:02:55 浏览: 10
在C++中,将两个非递减的有序链表合并成一个非递增的有序链表,可以采用迭代或递归的方式来实现。这里提供一个简单的迭代方法:
```cpp
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
// 创建一个新的头节点,初始值为空
ListNode* head = nullptr;
ListNode* tail = nullptr;
// 遍历两个链表
while (l1 != nullptr && l2 != nullptr) {
if (l1->val <= l2->val) { // 如果第一个链表元素较小,添加到新链表
if (head == nullptr) {
head = l1; // 新链表的第一个元素
} else {
tail->next = l1; // 连接当前节点和第一个小的元素
}
l1 = l1->next; // 移动到下一个元素
} else { // 否则,第二个链表元素较小
if (head == nullptr) {
head = l2; // 新链表的第一个元素
} else {
tail->next = l2; // 连接当前节点和第二个小的元素
}
l2 = l2->next; // 移动到下一个元素
}
tail = tail->next; // 更新tail指向最后一个已连接的元素
}
// 如果其中一个链表还有剩余元素,将其添加到最后
if (l1 != nullptr) {
tail->next = l1;
} else if (l2 != nullptr) {
tail->next = l2;
}
return head;
}
```
在这个过程中,我们不需要额外的空间,因为始终是原地操作。注意,这个算法假设两个输入链表都是非空且已经排序。
阅读全文