将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据。c++
时间: 2024-10-26 19:02:55 浏览: 20
C++版本将两个有序链表合并为一个新的有序链表并返回原理及代码实现
在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;
}
```
在这个过程中,我们不需要额外的空间,因为始终是原地操作。注意,这个算法假设两个输入链表都是非空且已经排序。
阅读全文