淘宝客怎么做推广网站,新手建站素材,公司logo效果图,网站一次性链接怎么做两数相加 给出两个 非空 的链表用来表示两个非负的整数。其中#xff0c;它们各自的位数是按照 逆序 的方式存储的#xff0c;并且它们的每个节点只能存储 一位 数字。
如果#xff0c;我们将这两个数相加起来#xff0c;则会返回一个新的链表来表示它们的和。
您可以假设…两数相加 给出两个 非空 的链表用来表示两个非负的整数。其中它们各自的位数是按照 逆序 的方式存储的并且它们的每个节点只能存储 一位 数字。
如果我们将这两个数相加起来则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外这两个数都不会以 0 开头。
示例
输入(2 - 4 - 3) (5 - 6 - 4) 输出7 - 0 - 8 原因342 465 807
链表数学运算的问题:写递归函数要考虑好两个问题 1/什么时候是递归边界 2/如何防止运算过程中的访问越界问题 3/防止递归到下一层时越界
对于本问题1当递归进行加操作时走到了两个都是NULL的时候返回1个不是NULL时说明还有数据还要进行加操作的处理。递归边界一定要注意是真的递归边界不会导致错误的递归边界。这里也就是判断没有加操作的强约束就是两个表都是空表的时候。
对于问题2:当进行任何访问指针指向的内容比如r-val或是r-next 都要注意提前判断当前节点r是否为NULL
问题3见代码
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {if(l1NULLl2NULL)return l1;//边界强约束判定防止两个0的结果 若是两个指针都已经指空了说明来到了指针尽头 返回int v1,v2;if(l1NULL)v1 0;else v1 l1-val;if(l2NULL)v2 0;else v2 l2-val;int sum v1v2;//操作执行if(l1!NULL)//判空l1-val sum%10;else l1 new ListNode(sum%10);if(sum9){if(l1-nextNULL)l1-next new ListNode(1);else l1-next-val1;}//递归防止越界递归ListNode *p1l1,*p2l2;if(p2NULL)l1-next addTwoNumbers(p1-next,p2);//如果p2空了说明2链表长度短 那么没必要传p2-next,因为此时p2本身就是空的else l1-next addTwoNumbers(p1-next,p2-next);//p2不空 return l1;}
};