文章目录
- 1.题目概述
- 2.思路分析
- 3.代码解析
1.题目概述
这个题目模拟的就是两个数字的求和:在这个过程中我们的每一个数字都是按照相反的这个顺序给出来的,例如254,在这个链表上面进行表示的时候就是452,这个是顺序的问题,在这个题目上面也是有这个对应的说明的:数字按照逆序的方式进行存储;
给定的这个示例1里面:342+465都是按照这个相反的这个顺序排列的,但是这个进行求和的结果是按照我们的正常的这个顺序进行计算的,得到的结果就是807也是使用的这个逆序的方式进行表示的;
2.思路分析
我们首先需要明白这个题目为什么需要逆序:342+465这两个数字进行加法操作的时候,实际上这个逆序是方便我们进行处理的,因为我们相加操作的时候,是从这个个位开始计算结果的,因此这个逆序之后,我们可以直接从这个链表的第一个节点开始进行这个运算,这个是简化了我们的相关操作的;
如果题目给的不是逆序的这个链表,这个时候你需要想办法获取这个最后一个数字,然后进行求和,这样反而会变得更加复杂一些,因此如果题目没有进行这个逆序的操作,我们是需要首先对于这个链表里面的元素进行逆序的处理的,这样才可以方便我们的后续的操作;
首先就是进行这个指针的定义,cur1和cur2分别指向这两个链表里面的第一个元素,这个时候我们的这个计算的过程就开始了;t就是计算这个对应的数位上面的数字的求和的结果;
我们需要定义一个虚拟的头结点,为什么需要进行定义虚拟头结点,这个原因需要明白:如果你不进行这个虚拟的头结点的定义,你需要把这个7放到头结点里面去,就是你需要进行额外的处理,而且最后返回的之后不方便,定义了这个虚拟的头结点之后,你直接把这个计算的结果连接到我们的虚拟头结点的后面,最后返回的时候直接返回这个虚拟头结点的next位置,这个非常方便,希望你可以用心体会这个好处;
原本的这个t=7,放到我们的newhead虚拟节点的下一个位置之后,这个t就会变成0,这个时候cur1,cur2指向的就是新的元素,这个时候两个元素就是6+4=10,但是这个时候t=10的话,我们往这个链表里面并入的元素是0,也就是t%10操作结果,剩下的那个t/10当做的进位的,所以我们不能放到链表里面去,而是需要和下一位一起进行处理
接下来,这个cur1这个时候已经是没有数据了,所以这个时候cur2的位置对应的元素和我们的这个进位的1,也就是我们的这个t剩下的1相加,等于5放到我们的这个链表的后面;
上面的这个操作结束之后,我们的这个cur2本来应该是继续移动的,但是这个时候cur2下一个位置也是没有任何的元素了,这个时候我们的整个过程就结束了;
3.代码解析
首先进行这个cur1,cur2的相关的定义,prev就是我们的尾指针,cur1和cur2只要有一个不是空的,我们的这个循环就需要继续,所以这个while里面的这个逻辑运算符是或者,而不是且;
t!=0主要是因为防止这个最后一次计算的hi后依然是存在这个进位的,例如333+664,最后的这个还是进了一个1,这个时候虽然cur1和cur2都结束了,但是这个t里面还是有结果的,这个结果我们是不可以扔掉的;
粗人不是空的时候加到t上面去,移动到下一个位置,cur2也是同理,prev.next就是连接到我们的这个虚拟头节点后面的这个元素,根据上面分析的结果t%10的结果放到我们的这个链表里面去,prev继续右移,t需要进行这个更新的操作;