C语言将两个非递减的有序链表合并为一个非递增的有序链表,仍然用原来的存储空间
时间: 2023-10-18 13:19:29 浏览: 224
假设两个非递减有序链表分别为A和B,可以按照以下步骤合并它们:
1. 定义三个指针,分别指向A的当前节点、B的当前节点和A的前一个节点,初始时A和B的当前节点都指向链表头,A的前一个节点为NULL。
2. 从A和B中选择较小的节点,将其接到A的前一个节点后面。
3. 将A的前一个节点指向新加入的节点。
4. 将A的当前节点指向下一个节点,B的当前节点指向下一个节点。
5. 重复步骤2-4,直到A和B中任意一个链表为空。
6. 如果A链表已经为空,则将B链表剩余的节点全部接到A链表的前面。
7. 将A链表反转,得到一个非递增有序链表。
下面是具体的C语言实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int val;
struct Node* next;
} Node;
// 将链表反转
Node* reverse(Node* head) {
Node *p, *q, *r;
p = head;
q = NULL;
while (p != NULL) {
r = p->next;
p->next = q;
q = p;
p = r;
}
return q;
}
// 将两个非递减有序链表合并为一个非递增有序链表
void merge(Node* A, Node* B) {
Node *pa, *pb, *prev;
pa = A->next;
pb = B->next;
prev = A;
while (pa != NULL && pb != NULL) {
if (pa->val <= pb->val) {
prev->next = pa;
prev = pa;
pa = pa->next;
} else {
prev->next = pb;
prev = pb;
pb = pb->next;
}
}
if (pb != NULL) {
prev->next = pb;
}
A->next = reverse(A->next);
}
int main() {
// 构造两个非递减有序链表
Node* A = (Node*)malloc(sizeof(Node));
A->next = NULL;
Node* B = (Node*)malloc(sizeof(Node));
B->next = NULL;
Node* p = A;
Node* q = B;
int a[] = {1, 3, 5, 7, 9};
int b[] = {2, 4, 6, 8, 10};
int i;
for (i = 0; i < 5; i++) {
p->next = (Node*)malloc(sizeof(Node));
p = p->next;
p->val = a[i];
p->next = NULL;
q->next = (Node*)malloc(sizeof(Node));
q = q->next;
q->val = b[i];
q->next = NULL;
}
// 合并两个链表并输出结果
merge(A, B);
Node* r = A->next;
while (r != NULL) {
printf("%d ", r->val);
r = r->next;
}
printf("\n");
return 0;
}
```
上述代码中,我们首先定义了一个链表节点结构体,然后按照题目要求,构造了两个非递减有序链表A和B,接着调用merge函数将它们合并为一个非递增有序链表,并最终输出合并后的结果。在merge函数中,我们分别用pa和pb指向A和B的当前节点,prev指向A的前一个节点。从A和B中选择较小的节点,将其接到A的前一个节点后面,然后将A的前一个节点指向新加入的节点,将A的当前节点指向下一个节点,B的当前节点指向下一个节点。重复这个过程,直到A和B中任意一个链表为空。如果A链表已经为空,则将B链表剩余的节点全部接到A链表的前面。最后调用reverse函数将A链表反转,得到一个非递增有序链表。
阅读全文
相关推荐
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)