C语言版将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来 两个链表的存储空间
时间: 2024-10-11 19:13:30 浏览: 73
C++版本将两个有序链表合并为一个新的有序链表并返回原理及代码实现
在C语言中,合并两个非递减的有序链表并保持非递增顺序,可以采用迭代或者递归的方式来实现。这里我们假设两个链表都是头插法(linked list with head nodes)。
一种常见的做法是创建一个新的链表,然后遍历原链表,每次比较当前节点的值,将较小的那个添加到新链表,并更新指针指向下一个较小的节点。当其中一个链表遍历完,继续遍历另一个链表,直到所有节点都添加完毕。
下面是一个简单的伪代码示例:
```c
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} ListNode;
ListNode* mergeSortedLists(ListNode* list1, ListNode* list2) {
ListNode* dummy = (ListNode*)malloc(sizeof(ListNode)); // 创建虚拟头节点
dummy->next = NULL;
ListNode* current = dummy; // 当前指针,始终指向新链表
while (list1 && list2) { // 只要有一个链表还有节点
if (list1->data <= list2->data) { // 将较小的数据添加到新链表
current->next = list1;
list1 = list1->next;
} else {
current->next = list2;
list2 = list2->next;
}
current = current->next; // 移动current到下一个位置
}
// 如果其中一个链表已空,将剩余的链表连接到新链表尾部
if (list1)
current->next = list1;
else
current->next = list2;
return dummy->next; // 返回新的头节点
}
```
阅读全文