将两个递增有序链表合并为一个递增有序链表。要求 1.结果链表仍然使用原来两个链表的存储空间,不占用其它空间 2.表中不许有重复数据用c语言完整写出来
时间: 2024-09-23 07:15:14 浏览: 87
在C语言中,将两个递增有序链表合并为一个新的递增有序链表,并保持原链表的空间不变,可以采用迭代或递归的方式实现。这里提供一个简单的迭代方法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 合并两个有序链表的函数
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l1) return l2; // 如果l1为空,直接返回l2
if (!l2) return l1; // 如果l2为空,直接返回l1
// 创建新链表头指针
ListNode* result = (l1->val <= l2->val) ? l1 : l2;
// 使用临时指针遍历较小值链表
ListNode* temp = (result != l1) ? l1 : l2;
while (temp && temp->next) { // 当前链表非空且还有下一个元素
if (temp->next->val > temp->val) { // 检查是否需要切换到另一个链表
result->next = (result == l1) ? l2 : l1;
result = (result == l1) ? temp->next : temp; // 走到下一个最小值
} else {
temp = temp->next; // 继续遍历当前链表
}
}
// 链表结束时添加剩余链表
result->next = (result == l1) ? l2->next : l1->next;
return result;
}
// 测试函数
void printList(ListNode* head) {
while (head) {
printf("%d -> ", head->val);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 初始化两个示例链表
ListNode* l1 = (ListNode*)malloc(sizeof(ListNode));
l1->val = 1;
l1->next = (ListNode*)malloc(sizeof(ListNode));
l1->next->val = 2;
l1->next->next = NULL;
ListNode* l2 = (ListNode*)malloc(sizeof(ListNode));
l2->val = 1;
l2->next = (ListNode*)malloc(sizeof(ListNode));
l2->next->val = 3;
l2->next->next = NULL;
ListNode* merged = mergeTwoLists(l1, l2);
printList(merged); // 输出合并后的链表
free(l1);
free(l2);
return 0;
}
```
阅读全文