:将两个递增的有序链表合并为一个递减的有序链表。要求结果链表仍使用原来两个链表的存储空间用C语言实现
时间: 2024-11-03 18:24:06 浏览: 22
在C语言中,合并两个递增有序链表并将其变为递减顺序,我们需要创建一个新的头节点,并依次遍历两个输入链表。对于每个节点,我们将当前链表的较小值节点添加到新链表的头部,然后移动这两个链表的指针。以下是基本的算法步骤:
```c
#include <stdio.h>
#include <stdlib.h>
// 链表结构体定义
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 创建一个新的链表节点
ListNode* createNode(int val) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 合并递增有序链表到递减有序链表
ListNode* mergeSortedLists(ListNode* l1, ListNode* l2) {
// 新链表的头节点
ListNode* head = createNode(0);
ListNode* tail = head; // 尾部指针
while (l1 != NULL && l2 != NULL) {
if (l1->val > l2->val) { // 如果l1更大,将l2加入新链表
tail->next = l2;
l2 = l2->next;
} else { // 否则,将l1加入新链表
tail->next = l1;
l1 = l1->next;
}
tail = tail->next; // 更新尾部指针
}
// 如果其中一个链表还有剩余,直接追加到新链表末尾
if (l1 != NULL) {
tail->next = l1;
} else {
tail->next = l2;
}
return head->next; // 返回新链表的头节点
}
// 打印链表帮助理解过程
void printList(ListNode* node) {
while (node != NULL) {
printf("%d -> ", node->val);
node = node->next;
}
printf("NULL\n");
}
int main() {
// 例子:l1 = [1, 2, 4] 和 l2 = [1, 3, 4]
ListNode* l1 = createNode(1);
l1->next = createNode(2);
l1->next->next = createNode(4);
ListNode* l2 = createNode(1);
l2->next = createNode(3);
l2->next->next = createNode(4);
ListNode* result = mergeSortedLists(l1, l2);
printList(result); // 输出:4 -> 3 -> 2 -> 1 -> 1 -> 4
return 0;
}
```
阅读全文