将两非递减的有序链表合并为一非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间。表中允许有重复的数据。C语言代码
时间: 2024-10-14 11:02:21 浏览: 54
C++版本将两个有序链表合并为一个新的有序链表并返回原理及代码实现
将两个非递减的有序链表合并成一个非递增的有序链表的问题,可以使用迭代的方式解决。以下是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));
if (!newNode) {
printf("Memory allocation failed.\n");
return NULL;
}
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 合并两个有序链表
ListNode* mergeSortedLists(ListNode* list1, ListNode* list2) {
ListNode* mergedList = NULL; // 新链表头指针
ListNode* current1 = list1; // 初始指向list1
ListNode* current2 = list2; // 初始指向list2
while (current1 && current2) { // 当两个链表都有元素时
if (current1->val <= current2->val) { // 如果list1的值较小或相等
if (mergedList == NULL) { // 如果新链表为空,直接添加
mergedList = current1;
} else {
mergedList->next = current1;
}
current1 = current1->next; // 移动到下一个list1元素
} else { // 否则,list2的值较小
if (mergedList == NULL) {
mergedList = current2;
} else {
mergedList->next = current2;
}
current2 = current2->next; // 移动到下一个list2元素
}
}
// 如果其中一个链表还有剩余元素未处理,将其添加到新链表尾部
if (current1 != NULL) {
mergedList->next = current1;
} else if (current2 != NULL) {
mergedList->next = current2;
}
return mergedList;
}
// 打印链表
void printList(ListNode* head) {
ListNode* temp = head;
while (temp != NULL) {
printf("%d ", temp->val);
temp = temp->next;
}
printf("\n");
}
int main() {
// 测试示例
ListNode* list1 = createNode(1);
list1->next = createNode(4);
list1->next->next = createNode(5);
ListNode* list2 = createNode(1);
list2->next = createNode(3);
list2->next->next = createNode(4);
list1->next->next->next = list2->next->next; // 连接两个链表
ListNode* result = mergeSortedLists(list1, list2);
printList(result);
return 0;
}
```
在这个代码里,我们首先创建了两个已排序的链表`list1`和`list2`。然后通过一个while循环,每次比较两个链表当前节点的值,选择较小的一个添加到新链表`mergedList`中,并移动对应指针。最后返回合并后的链表。
阅读全文