编程实现: 将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间。表中不允许有重复的数据。数据结构
时间: 2024-10-11 17:11:29 浏览: 34
C++版本将两个有序链表合并为一个新的有序链表并返回原理及代码实现
在编程中,将两个递增的有序链表合并成一个新的有序链表可以采用迭代或递归的方式来实现。这里我们提供一种迭代的方法,假设链表节点的结构如下:
```cpp
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
```
**迭代算法步骤:**
1. 创建一个新的头结点 `dummy` 和指针 `prev`, 初始化它们都指向 `nullptr`。
2. 遍历第一个链表 `l1` 和第二个链表 `l2` 的当前节点:
- 如果 `l1` 的值小于等于 `l2` 的值,将 `l1` 指向的节点添加到结果链表,并更新 `l1` 为 `l1->next`。
- 否则,将 `l2` 指向的节点添加到结果链表,并更新 `l2` 为 `l2->next`。
3. 当遍历完其中一个链表时,将另一个链表剩余的部分直接接到结果链表的 `prev->next`。
4. 结果链表的最后一个节点的 `next` 指针设为 `nullptr`。
以下是对应的伪代码:
```cpp
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode dummy(0); // 新链表头结点
ListNode* prev = &dummy; // 上一个节点
while (l1 && l2) {
if (l1->val <= l2->val) {
prev->next = l1;
l1 = l1->next;
} else {
prev->next = l2;
l2 = l2->next;
}
prev = prev->next;
}
// 添加剩余的链表部分
if (l1) {
prev->next = l1;
} else {
prev->next = l2;
}
return dummy.next; // 返回新链表的头结点
}
```
阅读全文