LeetCode | 21.合并两个有序链表(C语言版)

简介: LeetCode | 21.合并两个有序链表(C语言版)

      这次来写一下 LeetCode 的第 21 题,合并两个有序链表。

题目描述

       题目直接从 LeetCode 上截图过来,题目如下:


       上面的题就是 合并两个有序链表 题目的截图,同时 LeetCode 会根据选择的语言给出了一个类的定义或者函数的定义,然后在其中实现 合并两个有序链表 的解题过程。这次我使用 C 语言来进行完成。

       C 语言给出的函数定义如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
}

       通过函数定义可以看出,mergeTwoLists 函数的参数是两个单向链表,然后返回值也是一个链表,我们要做的就是把两个有序的链表合并成一个新的有序链表。

问题分析 

      这个题目中提供的两个链表本身就是有序的链表,只要我们把链表的节点逐个的遍历并比较一遍,就可以合并为另外一个有序的列表。


       我们来看一下下面的两幅图,当 链表 l1 节点上的值 和 链表 l2 节点上的值 进行比较时,只要 l1 节点上的值 小于等于 链表 l2 节点上的值,那么我们就取 链表 l1 节点上的值 放入 新的链表节点 上,并将指向 链表 l1 节点的指针 移动到下一个元素。反之,则将 链表 l2 节点上的值 放入 新的链表节点 上,并将指向 链表 l2 节点的指针 移动到下一个元素。


       在两个有序链表节点个数相同的时候,这样做是没有问题的,如果两个有序链表节点个数不相同的话,那么当一个链表的所有节点已经遍历完,那么就去遍历剩下的一条链表即可。如下图。

代码实现

       C 语言的代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
    struct ListNode* ll1 = l1;
    struct ListNode* ll2 = l2;
    struct ListNode* ll = NULL;
    struct ListNode* cur = NULL;
    while (ll1 != NULL || ll2 != NULL) {
        struct ListNode* tmp = (struct ListNode*)malloc(sizeof(struct ListNode));
        tmp->next = NULL;
        // 初始化新节点的指针
        if (cur == NULL) {
            cur = tmp;
            ll = tmp;
        } else {    // 当前节点指针的下一个节点
            cur->next = tmp;
            cur = tmp;
        }
        // ll1为NULL后,遍历链表ll2
        if (ll1 == NULL) {
            tmp->val = ll2->val;
            ll2 = ll2->next;
            continue;
        }
        // ll2为NULL后,遍历链表ll1
        if (ll2 == NULL) {
            tmp->val = ll1->val;
            ll1 = ll1->next;
            continue;
        }
        // ll1节点的当前值小于等于ll2节点的当前值
        // 则把ll1节点的当前值放入tmp节点中
        if (ll1->val <= ll2->val) {
            tmp->val = ll1->val;
            ll1 = ll1->next;
        } else {
            tmp->val = ll2->val;
            ll2 = ll2->next;
        }
    }
    return ll;
}

      代码中有了详细的注释,就不对代码做过多的解释了。

提交结果

     在写完代码后,点击右下角的 “执行代码”,然后观察 “输出” 和 “预期结果” 是否一致,一致的话就点击 “提交” 按钮。点击 “提交” 按钮后,系统会使用更多的测试用例来测试我们写的函数体,如果所有的测试用例都通过了,那么就会给出 “通过” 的字样,如果没有通过,会给出失败的那一组测试用例,我们可以根据给出的测试用例来继续修改代码。我们的代码提交后的截图如下:

相关文章
|
3月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
41 1
|
3月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
56 0
Leetcode第21题(合并两个有序链表)
|
3月前
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
117 0
|
1月前
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
442 6
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
71 5
|
2月前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
116 4
|
3月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
3月前
|
存储 缓存 C语言
C语言:链表和数组有什么区别
C语言中,链表和数组是两种常用的数据结构。数组是一种线性结构,元素在内存中连续存储,通过下标访问,适合随机访问且大小固定的情况。链表由一系列不连续的节点组成,每个节点存储数据和指向下一个节点的指针,适用于频繁插入和删除操作的场景,链表的大小可以动态变化。
|
3月前
|
C语言
无头链表再封装方式实现 (C语言描述)
如何在C语言中实现无头链表的再封装,包括创建节点和链表、插入和删除操作、查找和打印链表以及销毁链表的函数。
37 0
|
3月前
|
C语言
C语言链式结构之有头单链表再封装写法
本文介绍了如何使用C语言对有头单链表进行封装,包括节点的创建、链表的初始化、数据的插入和删除,以及链表的打印等功能。
27 1