将两个有序链表1,3,5,7,9,和2,4,6,8,,合并成一个有序链表用c语言
时间: 2024-09-15 09:05:53 浏览: 37
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));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 合并两个有序链表
ListNode* mergeSortedLists(ListNode* list1, ListNode* list2) {
// 创建头节点,并初始化指针
ListNode* head = NULL;
ListNode* tail = NULL;
// 比较两个链表的当前节点值
while (list1 && list2) {
if (list1->val <= list2->val) {
// 如果list1的值小,将其添加到结果链表
if (!head) {
head = list1;
} else {
tail->next = list1;
}
list1 = list1->next; // 移动list1指针
} else {
// 否则,list2的值小,同理操作
if (!head) {
head = list2;
} else {
tail->next = list2;
}
list2 = list2->next;
}
tail = list1 ? list1 : list2; // 更新tail指向最后一个添加的节点
}
// 添加剩余的链表节点(如果其中一个链表已经结束)
if (list1)
tail->next = list1;
else
tail->next = list2;
return head;
}
// 打印链表
void printList(ListNode* node) {
while (node) {
printf("%d -> ", node->val);
node = node->next;
}
printf("NULL\n");
}
int main() {
// 创建两个示例链表
ListNode* list1 = createNode(1);
list1->next = createNode(3);
list1->next->next = createNode(5);
list1->next->next->next = createNode(7);
list1->next->next->next->next = createNode(9);
ListNode* list2 = createNode(2);
list2->next = createNode(4);
list2->next->next = createNode(6);
list2->next->next->next = createNode(8);
// 合并并打印结果
ListNode* mergedList = mergeSortedLists(list1, list2);
printList(mergedList);
return 0;
}
```
运行此程序,你会得到合并后的有序链表:1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9。
阅读全文