C语言版将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来 两个链表的存储空间
时间: 2024-10-11 12:13:30 浏览: 86
在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; // 返回新的头节点
}
```
阅读全文