合并两个有序链表

要求将两个升序链表合并为一个新的升序链表,并返回合并后的链表。问题本质上是两个链表的归并操作,考察对链表的操作和合并逻辑。

解题思路:

  1. 创建虚拟头节点:我们需要一个虚拟头节点来简化链表的操作。虚拟头节点后会连接我们按顺序合并的节点。
  2. 双指针遍历链表:我们使用两个指针分别指向两个链表的当前节点,逐步比较两个链表的节点值,将较小的节点连接到新链表,并移动对应的指针。
  3. 处理剩余节点:当其中一个链表遍历完后,将另一个链表的剩余节点直接连接到新链表末尾。
  4. 返回结果:最终返回虚拟头节点的下一个节点,即合并后的链表。

C语言代码实现:

c 复制代码
#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构体
struct ListNode {
    int val;
    struct ListNode *next;
};

// 合并两个有序链表的函数
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
    // 创建虚拟头节点
    struct ListNode dummy;
    struct ListNode *tail = &dummy;
    dummy.next = NULL;

    // 比较两个链表的节点,按顺序合并
    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;
    }

    // 处理剩余的链表节点
    if (l1 != NULL) {
        tail->next = l1;
    } else {
        tail->next = l2;
    }

    // 返回合并后的链表
    return dummy.next;
}

// 创建链表节点
struct ListNode* createNode(int val) {
    struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
    newNode->val = val;
    newNode->next = NULL;
    return newNode;
}

// 打印链表
void printList(struct ListNode* head) {
    while (head != NULL) {
        printf("%d -> ", head->val);
        head = head->next;
    }
    printf("NULL\n");
}

// 主函数
int main() {
    // 创建第一个有序链表 1 -> 2 -> 4
    struct ListNode* l1 = createNode(1);
    l1->next = createNode(2);
    l1->next->next = createNode(4);

    // 创建第二个有序链表 1 -> 3 -> 4
    struct ListNode* l2 = createNode(1);
    l2->next = createNode(3);
    l2->next->next = createNode(4);

    // 合并两个链表
    struct ListNode* mergedList = mergeTwoLists(l1, l2);

    // 打印合并后的链表
    printList(mergedList);

    return 0;
}

代码讲解:

  1. mergeTwoLists函数

    • 使用了一个虚拟头节点 dummy 来简化链表操作,tail 指向当前合并链表的最后一个节点。
    • 通过遍历 l1l2,将较小的节点附加到 tail 后,并移动指针。
    • 遍历结束后,将未处理完的链表直接连接到 tail
  2. createNode函数:用于创建链表节点,方便构建链表。

  3. printList函数:用于打印链表,以方便查看结果。

  4. main函数 :创建两个有序链表,并调用 mergeTwoLists 函数合并链表,最后输出合并结果。

总结:

该方法采用了迭代的方式来合并两个链表,每次比较链表节点的值,时间复杂度为 O(n+m),其中 n 和 m 分别是两个链表的长度。该算法时间复杂度和空间复杂度都较优,适合处理一般的链表合并问题。

相关推荐
涛ing3 小时前
32. C 语言 安全函数( _s 尾缀)
linux·c语言·c++·vscode·算法·安全·vim
xrgs_shz4 小时前
MATLAB的数据类型和各类数据类型转化示例
开发语言·数据结构·matlab
独正己身4 小时前
代码随想录day4
数据结构·c++·算法
厂太_STAB_丝针5 小时前
【自学嵌入式(8)天气时钟:天气模块开发、主函数编写】
c语言·单片机·嵌入式硬件
利刃大大6 小时前
【回溯+剪枝】找出所有子集的异或总和再求和 && 全排列Ⅱ
c++·算法·深度优先·剪枝
charlie1145141917 小时前
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(协议层封装)
c语言·驱动开发·单片机·学习·教程·oled
*TQK*7 小时前
ZZNUOJ(C/C++)基础练习1041——1050(详解版)
c语言·c++·编程知识点
Rachela_z7 小时前
代码随想录算法训练营第十四天| 二叉树2
数据结构·算法
细嗅蔷薇@7 小时前
迪杰斯特拉(Dijkstra)算法
数据结构·算法
追求源于热爱!7 小时前
记5(一元逻辑回归+线性分类器+多元逻辑回归
算法·机器学习·逻辑回归