- 两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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(l1==NULL&&l2==NULL)return l1;//边界强约束判定:防止两个0的结果 若是两个指针都已经指空了说明来到了指针尽头 返回int v1,v2;if(l1==NULL)v1 = 0;else v1 = l1->val;if(l2==NULL)v2 = 0;else v2 = l2->val;int sum = v1+v2;//+操作执行if(l1!=NULL)//判空l1->val = sum%10;else l1 = new ListNode(sum%10);if(sum>9){if(l1->next==NULL)l1->next = new ListNode(1);else l1->next->val+=1;}//递归防止越界递归ListNode *p1=l1,*p2=l2;if(p2==NULL)l1->next = addTwoNumbers(p1->next,p2);//如果p2空了说明2链表长度短 那么没必要传p2->next,因为此时p2本身就是空的else l1->next = addTwoNumbers(p1->next,p2->next);//p2不空 return l1;}
};