leetcode. 2(两数相加)C++

链表:可以改变长度,在删除对象的时候会自动释放内存,占用的内存空间也不需要连续。
链表是用 listnode 结点构成的,这些结点之间用指针链接。最简单的单向链表:每个结点代表两个东西 1.它自己的值value ,2.指向下一个结点的指针next。next为空时,表示是链表的最后一个结点。
p->value p点的值
p->next p点的下一个结点

首先题目中给的重要信息都加粗了,非空链表,逆序存储
逆序存储就是根节点存的是个位,然后下一个结点存十位,再下一个百位,依次类推。

编程中要注意:
1.考虑进制 sum/10就是进1还是进0
sum%10 就是当前位的数值
2.考虑 l1,l2 是不是空的
最后的sum.每往后挪一个,都要创建一个新的结点,并且要注意指针的移动。
3.要和结构体里面的定义相对应,一开始写的时候忘了对应,导致编译很多错误。
4.使用哑结点。要对头结点进行操作时,考虑创建哑节点sum,使用
sum->next表示真正的头节点。这样可以避免处理头节点为空的边界问题

/**
 * 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) {
        int carry=0,val1=0,val2=0,sum_val; 
        ListNode *sum=new ListNode(0);//创建一个哑结点
        ListNode *cur=sum;
        while(l1!=NULL||l2!=NULL)//考虑空链表
        {
            val1=(l1!=NULL)?l1->val:0;
            val2=(l2!=NULL)?l2->val:0;
            sum_val=(val1+val2+carry)%10;
            carry=(val1+val2+carry)/10;
            cur->next =new ListNode (sum_val);
            cur= cur->next;
            if(l1!=NULL)l1=l1->next;
            if(l2!=NULL)l2=l2->next;            
        }
        if(carry==1) // 看最高位有没有进位
        {
            cur->next=new ListNode(1);
        }
        return sum->next;//相当于返回两束之和的新的头结点
    }
};

额外补充:
这是第一次做链表相关的问题,百度到了一些经典链表问题,感觉还挺有用的,存着自己以后好好研究一下。

C/C++ 的奇技淫巧(雕虫小技) :
链表逆序

链表逆序
不可申请额外空间

单向链表的相关介绍:
基础

哑结点:
哑结点的使用

你可能感兴趣的:(leetcode. 2(两数相加)C++)