将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
// 定义一个函数,用于合并两个有序的链表(链表节点类型为struct ListNode)
// 参数list1和list2分别是要合并的两个链表的头指针
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
// 如果list1为空链表,那么直接返回list2,因为合并后的结果就是list2本身
if (list1 == NULL) {
return list2;
}
// 如果list2为空链表,那么直接返回list1,因为合并后的结果就是list1本身
if (list2 == NULL) {
return list1;
}
// 创建一个新的链表节点,用于存储合并后的链表(这个节点是一个临时的头节点,最后返回时会返回它的下一个节点)
struct ListNode* list3 = (struct ListNode*)malloc(sizeof(struct ListNode));
// 创建一个指针p,初始时指向新创建的节点list3,后续用它来构建合并后的链表
struct ListNode* p = list3;
// 当list1和list2都不为空时,循环比较两个链表当前节点的值,将较小值的节点连接到合并后的链表中
while (list1!= NULL && list2!= NULL) {
// 如果list1当前节点的值小于等于list2当前节点的值
if (list1->val <= list2->val) {
// 将list1当前节点连接到合并后的链表(通过p指针操作)
p->next = list1;
// 移动list1指针到下一个节点,准备下次比较
list1 = list1->next;
}
else {
// 如果list2当前节点的值更小,将list2当前节点连接到合并后的链表(通过p指针操作)
p->next = list2;
// 移动list2指针到下一个节点,准备下次比较
list2 = list2->next;
}
// 移动p指针到新连接上的节点,以便后续继续连接其他节点
p = p->next;
}
// 如果循环结束后list1还有剩余节点(说明list1比list2长),将剩余的list1节点全部连接到合并后的链表末尾
if (list1!= NULL) {
p->next = list1;
}
// 如果循环结束后list2还有剩余节点(说明list2比list1长),将剩余的list2节点全部连接到合并后的链表末尾
if (list2!= NULL) {
p->next = list2;
}
// 返回合并后链表的真实头节点(因为之前创建的list3是临时头节点,它的下一个节点才是实际开始的节点)
return list3->next;
这段代码的主要功能是合并两个有序的链表(升序排列,通过节点值大小比较),将它们合并成一个新的有序链表,并返回合并后链表的头指针。它通过逐个比较两个链表节点的值,依次将较小值的节点连接到新链表中,直到其中一个链表遍历完,然后将另一个链表剩余的节点直接接到新链表末尾来实现合并操作。
时间复杂度O(N+M)
空间复杂度O(1)