您的位置:首页 > 汽车 > 时评 > 【算法专题--链表】两数相加 -- 高频面试题(图文详解,小白一看就懂!!)

【算法专题--链表】两数相加 -- 高频面试题(图文详解,小白一看就懂!!)

2024/11/16 21:55:40 来源:https://blog.csdn.net/weixin_45031801/article/details/140059170  浏览:    关键词:【算法专题--链表】两数相加 -- 高频面试题(图文详解,小白一看就懂!!)

目录

一、前言

二、题目描述 

三、解题方法 

⭐双指针 -- 模拟进位 (使用哨兵位头节点)

🥝 什么是哨兵位头节点?  

🍇思路解析

🍍案例图解 

四、总结与提炼 

五、共勉  


一、前言

       两数相加 这道题,可以说是--链表专题--,最经典的一道题,也是在面试中频率最高的一道题目,通常在面试中,面试官可能会从多个方面考察这道题目,所以大家需要对这道题目非常熟悉哦!!
       本片博客就来详细的讲讲解一下 两数相加 的实现方法,让我们的面试变的更加顺利!!!

二、题目描述 

题目链接:2. 两数相加 - 力扣(LeetCode) 

给你两个 非空 的 链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表

三、解题方法 

⭐双指针 -- 模拟进位 (使用哨兵位头节点)

🥝 什么是哨兵位头节点?  

什么是 哨兵位 头节点? 

  • 它是一个附加的链表结点,该 结点 作为 第一个节点它的数据域不存储任何东西,只是为了操作的方便而引入的。
  • 也就是说,如果一个链表有哨兵节点的话,那么链表表的第一个元素应该是链表的第二个节点。

 哨兵位 --- 头节点的作用:  

  • 比如向链表中插入一个节点,对于没有哨兵位单链表当待插入的节点为链表的第一个节点,由于没有前驱,需要进行特殊处理,从而代码的复杂性增加。 
  • 如果有哨兵位头节点,则第一个节点的处理方式与其它节点相同,可以统一进行处理

🍇思路解析

 题目分析:

一、:给了两个非空的链表,按照逆序的方式存储。OK ,我们先不管他是“逆序”还是“顺序”,对我们来说无所谓。两数相加嘛,很简单的加法计算,因此无论是“逆序”还是“顺序”我们都按照一一对应的位置进行相加就可以了,无所谓顺序如何。

二:问题来了?仅仅是两数相加那么简单吗?如果是 9 + 2 呢?我们难道要输出这位的数字 11吗事实证明,我们要进行——“进位”的操作,这样就满足数学的计算法则了。 

三:说的那么简单,如何进行“进位”这个操作呢?别急~~   先想想,如果我们把 l1 l2 每一位上对应数字 n1、n2 以及进位的数字 rise,三者进行相加 ( n1 + n2 + rise ) ,得到一个“sum”(和),对吧?那么我们对这个”sum“进行 sum / 10 ,这样得到一个数字 C 大家想想这个 C 是不是该位上对下一位的 “进位值” ?


解题思路: 

  • 我们先假设给定的不是链表形式的数字,而是正常的非负整数,则两数相加遵循正常的加法运算,个位数与个位数相加,十位数与十位数相加,如果该位计算结果>9,则向前进位 

  • 那么我们应该怎样取链表中的每一位数字呢?我们定义两个指针,分别指向两个链表的头,然后取出该位置的数字,依次进行计算。 (双指针算法) 

明白上面的大概操作后,肯定还有很多细节没法理解,我们在进行一次图解,让大家更加清楚知道,如何使用双指针 -- 模拟进位


🍍案例图解 

案例图解: l1【2 ,4 ,3】                 l2【5 ,6 ,4】

 

  •  最后,返回 pre_head-> next 即可

 代码:

class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {// 创建一个哨兵位节点ListNode* pre_head = new ListNode(-1);// 指向上述 哨兵位节点 作为当前节点ListNode* cur = pre_head;// 模拟进位  双指针 遍历两个链表int rise = 0;  // 保存进位while(l1!=nullptr || l2!=nullptr)  //开始遍历两个链表,l1 和 l2 为两个双指针{int x = l1==nullptr ? 0 : l1->val;int y = l2==nullptr ? 0 : l2->val;// 求和 ,对应位的数字相加 再加上前一位的进位int sum = x + y + rise;rise = sum/10;  // 更新进位sum = sum%10;   // 保留尾数cur->next = new ListNode(sum);// 后移cur = cur->next;if(l1!=nullptr){l1 = l1->next;}if(l2!=nullptr){l2 = l2->next;}}// 最后一步加完后 如果有进位if(rise == 1){cur->next = new ListNode(rise);}return pre_head->next;}
};

 四、总结与提炼 

        最后我们来总结一下本文所介绍的内容,本文讲解来一道力扣中有关 两数相加 的题目,这道题目是校招笔试面试中有关链表章节非常高频的一道题目大家下去一定要自己再画画图,分析一下,把这段代码逻辑自己实现一遍,才能更好地掌握 

五、共勉  

       以下就是我对 两数相加 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对 链表专题 的理解,请持续关注我哦!!!  

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com