题目描述:
You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
大意:倒序的数(用链表来表示) 也就是342+465=807;注意如果最高位/10=1的情况,例如23+97=100;
解题思路:很简单,新建链表,用二级指针来决定该新建链表的结构。
在这里提一下二级指针,好多题目都用的到,大部分是在链表里面,二级指针的引入使得代码精简很多,但是二级指针的理解我个人花了很长时间去摸索(基础太差),理解如下(大家多批评指正,献丑了):所有指针都是变量,变量也需要地址来存贮,所以有了二级指针的存在,也就是二级指针里面存储的是一个指针变量的地址。拿该题来说;ret=null;**p=&ret;此时*p被赋值时,就代表了ret的值,因为解引用p之后,是得到的一个指针,等价于指针之间赋值。重点在于对p=&((*p)->next)的理解,这意味着p里面现在存的是下一个指针变量的地址,所以循环过程中*p再次被赋值的时候,就会将一个指针接到后面,也就是相当于p用来规划新的链表。和*p=*p->next的意义就完全不同了(*p只是改变了指针的值)c++primer第四版 chapter 4 数组和指针 page105:给指针赋值或通过指针进行赋值。如果对左操作数进行解引用,则修改的是指针所指向的对象,如果没有使用解引用,则修改的是指针本身的值。
代码如下:
/**
* 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) {
ListNode *ret=NULL;
ListNode **p=&ret;
int a=0;
while(l1&&l2)
{
*p=new ListNode((l1->val+l2->val+a)%10);
a=(l1->val+l2->val+a)/10;
p=&((*p)->next); //here ,change the point,if not ,change the value only(ret);then it will be cover by the right point
l1=l1->next;
l2=l2->next;
}
while(l1)
{
*p=new ListNode((l1->val+a)%10);
a=(l1->val+a)/10;
p=&((*p)->next);
l1=l1->next;
}
while(l2!=NULL)
{
*p=new ListNode((l2->val+a)%10);
a=(l2->val+a)/10;
p=&((*p)->next);
l2=l2->next;
}
if(a>0)
{
*p=new ListNode(a);
}
return ret;
}
};
代码分析:1,两个链表不一定长度相等,所以有3个while
2,a代表进位,每次相加之后都要更新%10,且最后一次的时候,如果a=1,那么代表有进位,必须链表后再接一个node