Add Two Numbers

题目描述:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值