写一段代码 将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据。
时间: 2023-10-18 16:27:29 浏览: 84
好的,以下是合并两个非递减有序链表为一个非递增有序链表的代码实现,同时满足题目要求不占用额外的存储空间:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
void merge(ListNode* l1, ListNode* l2) {
ListNode* p1 = l1;
ListNode* p2 = l2;
ListNode* pre = NULL;
while (p1 && p2) {
if (p1->val < p2->val) {
pre = p1;
p1 = p1->next;
} else {
ListNode* next = p2->next;
p2->next = p1;
if (pre) {
pre->next = p2;
} else {
l1 = p2;
}
pre = p2;
p2 = next;
}
}
if (!p1) {
pre->next = p2;
}
}
int main() {
// 构造两个非递减有序链表
ListNode* l1 = (ListNode*)malloc(sizeof(ListNode));
l1->val = 1;
l1->next = (ListNode*)malloc(sizeof(ListNode));
l1->next->val = 3;
l1->next->next = (ListNode*)malloc(sizeof(ListNode));
l1->next->next->val = 5;
l1->next->next->next = NULL;
ListNode* l2 = (ListNode*)malloc(sizeof(ListNode));
l2->val = 2;
l2->next = (ListNode*)malloc(sizeof(ListNode));
l2->next->val = 4;
l2->next->next = (ListNode*)malloc(sizeof(ListNode));
l2->next->next->val = 6;
l2->next->next->next = NULL;
// 合并两个链表
merge(l1, l2);
// 打印合并后的链表
ListNode* p = l1;
while (p) {
printf("%d ", p->val);
p = p->next;
}
printf("\n");
return 0;
}
```
上述代码中,我们使用了三个指针 `p1`、`p2` 和 `pre`,分别指向两个链表的当前节点和合并后链表的前一个节点。在遍历两个链表的过程中,如果 `p1` 节点的值比 `p2` 节点小,则将 `pre` 指针指向 `p1`,并将 `p1` 指针向后移动一位;否则将 `p2` 节点插入到 `p1` 节点之前,并更新 `pre` 指针和 `p2` 指针。最后,如果其中一个链表已经遍历完了,我们只需要将另一个链表的剩余部分连接到合并后链表的末尾即可。
需要注意的是,为了满足题目要求,我们不能新开辟空间来存储合并后的链表。因此,在将 `p2` 节点插入到 `p1` 节点之前时,我们需要记录 `p2` 的下一个节点,防止链表断裂。同时,由于第一个链表的头节点可能会被替换成第二个链表的头节点,因此我们需要返回合并后链表的头节点 `l1`。
阅读全文