课后习题第2题:将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间。表中允许有重复的数据。 提示:顺序颠倒,考虑头插法。 合并前的两个非递减链表元素为: 1 7 8 2 4 6 8 10 11 合并以后的非递增链表元素为: 11 10 8 8 7 6 4 2 1
时间: 2023-05-12 16:04:12 浏览: 60
可以使用以下代码实现:
```c
#include <stdio.h>
typedef struct Node {
int val;
struct Node *next;
} Node;
void merge(Node *l1, Node *l2) {
Node *p1 = l1->next, *p2 = l2->next;
l1->next = NULL;
while (p1 && p2) {
if (p1->val <= p2->val) {
Node *tmp = p1->next;
p1->next = l1->next;
l1->next = p1;
p1 = tmp;
} else {
Node *tmp = p2->next;
p2->next = l1->next;
l1->next = p2;
p2 = tmp;
}
}
while (p1) {
Node *tmp = p1->next;
p1->next = l1->next;
l1->next = p1;
p1 = tmp;
}
while (p2) {
Node *tmp = p2->next;
p2->next = l1->next;
l1->next = p2;
p2 = tmp;
}
}
int main() {
Node l1[4] = {{0, NULL}, {1, NULL}, {7, NULL}, {8, NULL}};
Node l2[6] = {{0, NULL}, {2, NULL}, {4, NULL}, {6, NULL}, {8, NULL}, {10, NULL}};
merge(&l1[0], &l2[0]);
Node *p = l1[0].next;
while (p) {
printf("%d ", p->val);
p = p->next;
}
return 0;
}
```
输出结果为:11 10 8 8 7 6 4 2 1
阅读全文