链表-2.两数相加-力扣(LeetCode)

一、题目解析

1、对逆序存储的数字求和,返回一个同样逆序的链表

2、不会出现先导0的情况

二、算法原理

解法:模拟两数相加的过程

定义一个变量t记录每一位之和,按照两数相加的过程,t=2+5,new 一个ListNode(t%10),这里7%10=7,t/=10进位操作,然后继续进行下去

哨兵位头节点和tail节点

为了避免边界条件的判断和操作遍历,我们会创建一个newhead的哨兵位头节点,该节点并不存储任何有限数据,仅做哨兵标记处理;由于返回逆序结果,我们需要多次对链表进行尾插操作,所以我们定义tail节点用于标记链表中最后一个节点,节约从头遍历找尾的时间

遍历边界条件

由于无法保证两个链表长度一致,所以会出现一个链表遍历完了,但另一个却没有遍历完的情况,需要特殊处理

检查记录每位之和变量t

存在两个链表都遍历完了,但是由于循环条件的设置,导致t中的进位情况没有处理完,所以需要在返回结果之前,检查t是否未0,不未0则需要new ListNode(t),然后接到tail节点的后面,最终返回newhead->next即可,我们返回的逆序和链表不包括哨兵位头节点

对于链表操作模糊的读者可以移步博主的另一篇博客

数据结构之单链表-CSDN博客or带头双向循环单链表-CSDN博客

三、代码示例

cpp 复制代码
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
    {
        ListNode* newhead = new ListNode();
        ListNode* tail = newhead; 
        ListNode* cur1 = l1;
        ListNode* cur2 = l2;
        int t = 0;
        while(cur1!=nullptr||cur2!=nullptr)
        {
            if(cur1 == nullptr)
            {
                t+=cur2->val;
                cur2 = cur2->next;
            }
            else if(cur2 == nullptr)
            {
                t+=cur1->val;
                cur1 = cur1->next;
            }
            else
            {
                t+=cur1->val;
                t+=cur2->val;
                cur1=cur1->next;
                cur2=cur2->next;
            }
            ListNode* newnode = new ListNode(t%10);
            t/=10;
            tail->next = newnode;
            tail=tail->next;
        }
        if(t!=0)
        {
            ListNode* newnode = new ListNode(t);
            tail->next = newnode;
        }
        return newhead->next;   
    }
};

看到最后,如果对您有所帮助,还请点赞、收藏和关注,我们下期再见!

相关推荐
ysa0510302 分钟前
二分+前缀(预处理神力2)
数据结构·c++·笔记·算法
灰色小旋风7 分钟前
力扣22 括号生成(C++)
开发语言·数据结构·c++·算法·leetcode
寒月小酒8 分钟前
3.23 OJ
数据结构·c++·算法
闻哥27 分钟前
MySQL InnoDB 缓存池(Buffer Pool)详解:原理、结构与链表管理
java·数据结构·数据库·mysql·链表·缓存·面试
罗湖老棍子37 分钟前
简单题(信息学奥赛一本通- P1539)
数据结构·算法·树状数组·区间修改 单点查询
圣保罗的大教堂44 分钟前
leetcode 1594. 矩阵的最大非负积 中等
leetcode
西西弟1 小时前
常见排序算法集合(数据结构)
数据结构·算法·排序算法
小龙报1 小时前
【数据结构与算法】栈和队列的综合应用:1.用栈实现队列 2.用队列实现栈 3.设计循环队列
c语言·数据结构·数据库·c++·redis·算法·缓存
重生之我是Java开发战士1 小时前
【广度优先搜索】队列:N叉树的层序遍历,二叉树的锯齿形层序遍历,二叉树的最大宽度,在每个树行中找最大值
数据结构·算法·leetcode·广度优先
zhoupenghui1681 小时前
redis 快速链表 详解
数据库·redis·链表·quicklist·快速链表