编程实现将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原 来两个链表的存储空间,不另外占用其他的存储空间。表中不允许有重复的数据。C语言
时间: 2024-09-13 10:14:27 浏览: 66
在C语言中,我们可以使用迭代的方式来合并两个递增的有序链表,而不需要额外的空间。以下是步骤的描述:
1. 首先,创建一个新的头节点 `mergedHead` 并设置为 `NULL`。
2. 定义三个指针:`p1` 指向第一个链表的头,`p2` 指向第二个链表的头,以及 `current` 指向 `mergedHead`。
3. 当 `p1` 和 `p2` 都不为空时,比较它们的值:
- 如果 `p1` 的值小于 `p2` 的值,将 `p1` 的数据赋给 `current->next`(`current` 后移),然后移动 `p1` 到下一个节点。
- 否则,如果 `p1` 的值大于 `p2` 的值,将 `p2` 的数据赋给 `current->next`(同样地,`current` 后移),然后移动 `p2` 到下一个节点。
- 最后,无论结果如何,都要记得更新 `current` 指针指向当前处理的节点。
4. 当其中一个链表遍历完,将另一个链表剩余的部分直接接到 `mergedHead` 的 `next` 上。
5. 返回 `mergedHead`,它就是合并后的有序链表的头。
以下是简化版的伪代码实现:
```c
struct ListNode* mergeSortedLists(struct ListNode* head1, struct ListNode* head2) {
struct ListNode *mergedHead = NULL, *current = mergedHead;
while (head1 != NULL && head2 != NULL) {
if (head1->val < head2->val) {
current->next = head1;
head1 = head1->next;
} else {
current->next = head2;
head2 = head2->next;
}
current = current->next;
}
// 将剩下的链表连接起来
if (head1 != NULL)
current->next = head1;
else
current->next = head2;
return mergedHead;
}
```
阅读全文