#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
struct ListNode {
int val;
struct ListNode* next;
};
// 合并两个升序链表的函数
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
// 创建头节点,动态分配内存
// 这个头节点作为辅助节点,初始值为0,next指针初始为NULL
struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));
head->val = 0;
head->next = NULL;
// p指针用于遍历和构建合并后的链表,初始指向辅助头节点
struct ListNode* p = head;
// 当l1和l2都不为NULL时,循环比较两个链表的当前节点值
while (l1 && l2) {
if (l1->val < l2->val) {
// 如果l1当前节点值小于l2当前节点值,将p的next指向l1当前节点
p->next = l1;
// l1指针后移,指向下一个节点
l1 = l1->next;
}
else {
// 如果l1当前节点值不小于l2当前节点值,将p的next指向l2当前节点
p->next = l2;
// l2指针后移,指向下一个节点
l2 = l2->next;
}
// p指针后移,指向合并后链表的新的末尾节点
p = p->next;
}
// 如果l1不为NULL,说明l1还有剩余节点,将p的next指向l1
if (l1) {
p->next = l1;
}
else if (l2) {
// 如果l2不为NULL,说明l2还有剩余节点,将p的next指向l2
p->next = l2;
}
// 返回合并后的链表头节点(跳过我们创建的辅助头节点)
// 将辅助头节点的next指针赋值给result,result现在指向合并后的链表的真正头节点
struct ListNode* result = head->next;
// 释放辅助头节点的内存
free(head);
// 返回合并后的链表头节点指针
return result;
}