可以使用归并的思想来合并两个有序链表。以下是C语言实现:
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
struct ListNode {
int val;
struct ListNode* next;
};
// 创建新节点
struct ListNode* createNode(int val) {
struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 合并两个有序链表
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
if (l1 == NULL) return l2;
if (l2 == NULL) return l1;
struct ListNode dummy; // 临时节点,便于拼接链表
struct ListNode* tail = &dummy; // 合并后的链表尾指针
// 合并操作
while (l1 != NULL && l2 != NULL) {
if (l1->val < l2->val) {
tail->next = l1;
l1 = l1->next;
} else {
tail->next = l2;
l2 = l2->next;
}
tail = tail->next;
}
// 连接剩余部分
tail->next = (l1 != NULL) ? l1 : l2;
return dummy.next;
}
// 打印链表
void printList(struct ListNode* head) {
while (head != NULL) {
printf("%d ", head->val);
head = head->next;
}
printf("\n");
}
int main() {
// 创建链表A: 1 -> 3 -> 5 -> 7 -> 9
struct ListNode* A = createNode(1);
A->next = createNode(3);
A->next->next = createNode(5);
A->next->next->next = createNode(7);
A->next->next->next->next = createNode(9);
// 创建链表B: 2 -> 4 -> 6 -> 8 -> 10
struct ListNode* B = createNode(2);
B->next = createNode(4);
B->next->next = createNode(6);
B->next->next->next = createNode(8);
B->next->next->next->next = createNode(10);
// 合并链表
struct ListNode* mergedList = mergeTwoLists(A, B);
// 打印合并后的链表
printList(mergedList);
// 释放内存
while (mergedList != NULL) {
struct ListNode* temp = mergedList;
mergedList = mergedList->next;
free(temp);
}
return 0;
}
这个代码首先定义了链表节点的结构体,并提供了创建新节点和打印链表的函数。合并两个有序链表的核心函数是 `mergeTwoLists`,使用归并的思想遍历两个链表并合并成一个新的有序链表。最后,在主函数中演示了如何创建两个示例链表并进行合并和打印。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |