【LeetCode刷题(数据结构与算法)】:链表中的两数相加

news/2025/2/22 18:31:22

在这里插入图片描述
给你两个非空的链表,表示两个非负的整数 它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储一位数字
请你将两个数相加,并以相同形式返回一个表示和的链表
你可以假设除了数字 0 之外,这两个数都不会以 0 开头
示例1:
在这里插入图片描述
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

方法:模拟

思路与算法
由于输入的两个链表都是逆序存储数字的位数的,因此两个链表中同一位置的数字可以直接相加
我们同时遍历两个链表,逐位计算它们的和,并与当前位置的进位值相加。具体而言,如果当前两个链表处相应位置的数字为 n1,n2进位值为 carry则它们的和为n1+n2+carryn1+n2+\textit{carry}n1+n2+carry;其中,答案链表处相应位置的数字为 (n1+n2+carry) mod 10,而新的进位值为 ⌊n1+n2+carry10⌋
如果两个链表的长度不同,则可以认为长度短的链表的后面有若干个 0
此外,如果链表遍历结束后,有 carry>0\textit{carry} > 0carry>0,还需要在答案链表的后面附加一个节点,节点的值为 carry
代码

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


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    if(l1==NULL&&l2==NULL)
    {return NULL;
    }
    struct ListNode*head=NULL;struct ListNode*tail=NULL;
    int carry=0;
    while(l1||l2){int n1=l1?l1->val:0;int n2=l2?l2->val:0;int sum=n1+n2+carry;
    if(!head){
        head=tail=(struct ListNode*)malloc(sizeof(struct ListNode));
        tail->val=sum%10;
        tail->next=NULL;
    }
    else{
        tail->next=(struct ListNode*)malloc(sizeof(struct ListNode));
        tail->next->val=sum%10;
        tail=tail->next;
        tail->next=NULL;
    }
    carry=sum/10;
    if(l1){
        l1=l1->next;
    }if(l2){
        l2=l2->next;
    }
    }
    if(carry>0){
        tail->next=(struct ListNode*)malloc(sizeof(struct ListNode));
        tail->next->val=carry;
        tail->next->next=NULL;
    }
    return head;
}

分析:这道题我们不方便直接在原来的两个链表上面进行直接的操作 因此我们可以定义两个结构体的指针head 和tail方便操作两个链表 细心的同学可以发现 在我们题目中给出的链表当中 不论是最开始相加的两个数 等于他所对应的值 从后面开始也是一个道理 并且中间为0的值我们可以用取余和取模的知识来巧妙的进行解决 最后一个数返回的及时我们取模后的数 然后用tail指针连接起来 这里大家可能有疑惑就是为什么我每次判断过后都要开辟空间 原因是因为我们的没有在原来的两个链表上面进行操作 我们在我们新开辟的链表上进行操作每次都是开辟一个结构体 每次用一个结构体指针过后又重新开辟一个结构体指针 这样也一定程度上避免了空间的浪费 希望大家能够理解


http://www.niftyadmin.cn/n/5097954.html

相关文章

解决 MyBatis 一对多查询中,出现每组元素只有一个,总组数与元素数总数相等的问题

文章目录 问题简述场景描述问题描述问题原因解决办法 问题简述 笔者在使用 MyBatis 进行一对多查询的时候遇到一个奇怪的问题。对于笔者的一对多的查询结果,出现了这样的一个现象:原来每个组里有多个元素,查询目标是查询所查的组,…

100问GPT4与大语言模型的关系以及LLMs的重要性

你现在是一个AI专家,语言学家和教师,你目标是让我理解语言模型的概念,理解ChatGPT 跟语言模型之间的关系。你的工作是以一种易于理解的方式解释这些概念。这可能包括提供 例子,提出问题或将复杂的想法分解成更容易理解的小块。现在…

国家开放大学 训练题

试卷代号:2044 教育研究方法 参考试题(开卷) 一、单选题(每题5分,共25分) 1.探索性研究常采用的研究方式包括( )。 A.文献调查、经验调查、典型情况或个案分析 B.调查性研究、…

编译添加了ALPHA开发板的NXP官方uboot

一. 简介 之前文章学习了 如何在NXP(恩智浦)官方 uboot 中添加正点原子的 ALPHA 开发板。 如何在NXP(恩智浦)官方 uboot 中添加正点原子的 ALPHA 开发板,文章如下: 向NXP官方uboot添加Nand版开发板-CSDN博…

过滤器(Filter)和拦截器(Interceptor)有什么不同?

过滤器(Filter)和拦截器(Interceptor)是用于处理请求和响应的中间件组件,但它们在实现方式和应用场景上有一些不同。 实现方式: 过滤器是Servlet规范中定义的一种组件,通常以Java类的形式实现。过滤器通过在…

CS鱼饵制作

文章目录 宏病毒(宏钓鱼)快捷方式钓鱼shellQMaker bug伪装pdf文件上线 宏病毒(宏钓鱼) 启动teamsever服务器,具体过程请参考我之前的文章: 在主机中启动CS客户端,111是真实机的用户&#xff1a…

如何让大模型自由使用外部知识与工具

本文将分享为什么以及如何使用外部的知识和工具来增强视觉或者语言模型。 全文目录: 1. 背景介绍 OREO-LM: 用知识图谱推理来增强语言模型 REVEAL: 用多个知识库检索来预训练视觉语言模型 AVIS: 让大模型用动态树决策来调用工具 技术交流群 建了技术交流群&a…

跳转传参有几种方式

在Vue Router中,实现路由跳转并传参有以下几种方式: 1. 路由参数(Route Params): 可以通过在路由配置中定义动态的占位符(即路由参数),并在跳转时通过URL路径来传递参数。这种方式适…