首页 > 其他分享 >力扣——21.合并两个有序链表(c语言)

力扣——21.合并两个有序链表(c语言)

时间:2023-04-22 13:58:05浏览次数:40  
标签:力扣 ListNode 21 next 链表 l2 l1 struct

title: 力扣——21.合并两个有序链表(c语言)

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

1、递归实现:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
    if(NULL == l1){
        return l2;
    }
    if(NULL == l2){
        return l1;
    }
    if(l1->val < l2->val){
        l1->next = mergeTwoLists(l1->next, l2);
        return l1;
    } else{
        l2->next = mergeTwoLists(l1, l2->next);
        return l2;
    }
}

复杂度分析:

时间复杂度:O(n+m),其中n和m分别为两个链表的长度。

空间复杂度:O(n+m),其中n和m分别为两个链表的长度。

递归调用 mergeTwoLists 会消耗栈空间。

执行结果:

执行用时:4 ms, 在所有 C 提交中击败了91.93%的用户

内存消耗:5.9 MB, 在所有 C 提交中击败了71.35%的用户

2、迭代实现:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
    struct ListNode* result = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* prev = result;

    while(l1!=NULL && l2!=NULL)
    {
        if(l1->val < l2->val){
            prev->next = l1;
            l1 = l1->next;
        } else{
            prev->next = l2;
            l2 = l2->next;
        }
        prev = prev->next;
    }
    prev->next = (l1==NULL)?l2:l1;
    return result->next;
    
}

复杂度分析:

时间复杂度:O(n+m),其中n和m分别为两个链表的长度。

空间复杂度:O(1),需要常数的时间存放若干变量。

执行结果:

执行用时:4 ms, 在所有 C 提交中击败了91.93%的用户

内存消耗:6 MB, 在所有 C 提交中击败了50.79%的用户

标签:力扣,ListNode,21,next,链表,l2,l1,struct
From: https://www.cnblogs.com/blue-Suri/p/17342933.html

相关文章

  • 力扣——83.删除排序链表中的重复元素(c语言)
    title:力扣——83.删除排序链表中的重复元素(c语言)题目描述:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。示例1:输入:1->1->2输出:1->2示例2:输入:1->1->2->3->3输出:1->2->3代码如下:/***Definitionforsingly-linkedlist.*structListNode{*......
  • 力扣——121.买卖股票的最佳时机(C语言)
    title:力扣——121.买卖股票的最佳时机(C语言)题目描述:给定一个数组,它的第i个元素是一支给定股票第i天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例1:输入:[7,1,5,3,6,......
  • 力扣——193.有效电话号码(shell)
    title:力扣——193.有效电话号码(shell)给定一个包含电话号码列表(一行一个电话号码)的文本文件file.txt,写一个bash脚本输出所有有效的电话号码。你可以假设一个有效的电话号码必须满足以下两种格式:(xxx)xxx-xxxx或xxx-xxx-xxxx。(x表示一个数字)你也可以假设每行前后没有......
  • 力扣——192.统计词频(shell)
    title:力扣——192.统计词频(shell)题目描述:写一个bash脚本以统计一个文本文件words.txt中每个单词出现的频率。为了简单起见,你可以假设:words.txt只包括小写字母和''。每个单词只由小写字母组成。单词间由一个或多个空格字符分隔。示例:假设words.txt内容如下:th......
  • 力扣——195.第十行(shell)
    title:力扣——195.第十行(shell)给定一个文本文件file.txt,请只打印这个文件中的第十行。示例:假设file.txt有如下内容:Line1Line2Line3Line4Line5Line6Line7Line8Line9Line10你的脚本应当显示第十行:Line10方法1:awk'NR==10'file.txt方法2:tai......
  • 力扣——240.搜索二维数组II(c语言)
    title:力扣——240.搜索二维数组II(c语言)同《剑指offer》04题目描述:编写一个高效的算法来搜索mxn矩阵matrix中的一个目标值target。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例1:输入:matrix=[[1,4,7,11,15],[2,5,8,12,19],......
  • 力扣——5.最长回文子串(c语言)
    题目描述:给定一个字符串s,找到s中最长的回文子串。你可以假设s的最大长度为1000。示例1:输入:"babad"输出:"bab"注意:"aba"也是一个有效答案。示例2:输入:"cbbd"输出:"bb"1、思路1:动态规划对于一个子串而言,如果它是回文子串,并且长度大于2,那么将它首尾两个字......
  • 4月21日总结
    STM32下载ELF文件、可执行bin文件的最小size测试1、STM32能下载ELF格式的文件吗?答:可以。因为所谓的bin文件就是ELF文件的.text代码段。当然前提是下载工具能识别ELF文件格式,STM32下载ELF文件并不意味着STM32可以把ELFdownload到Flash上,而是下载工具能从ELF提取到bin文件,下载时......
  • 热题100_20230421
    128、最长连续序列题目说明给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。解题思路1:排序此法不满足时间复杂度为O(n)先对数组进行排序,当遇到不连续的数时则重置当前的序列......
  • [P8766 [蓝桥杯 2021 国 AB] 异或三角]题解
    P8766[蓝桥杯2021国AB]异或三角题目描述分析题目中给出了三个限制首先我们不妨设\(a,b\ltc\),则而由于我们把\(c\)作为了最大值,原题需要有序对\((a,b,c)\)所以\(ans\ast3\)1.\(1\leqa,b,c\leqn\)2.\(a\oplusb\oplusc=0\)3.\(a+b\gtc\)而在枚举过程中,......