给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
解:
链表的每一个节点应该都是一个对象,期中data存储的就是这一项的值,next项存储的应该是下一个节点的位置。
对于python来讲,next直接就可以赋值成一个对象。data的值是int或者什么别的,next是对象。
与C不同的是,在python中是没有NULL的,取而代之的是None,它的含义是为空,但要注意和空列表与空字符串是不一样的,None的类型是Nonetype。
#############################从这里就改用c++了
/**
* 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 *dummyHead = new ListNode(0); //赋初值的时候加一个*表示这是个指针,然后后面跟的是地址
//也就是int *i = 某指针,赋初值可能只能用指针赋初值
ListNode *p =l1 ;
ListNode *q = l2;
ListNode *curr = dummyHead;
//不过这里的写法非常好,因为动用了指针的关系,所以不能直接传什么用什么,还要先倒一步,反正指针不占地方
int carry =0;
//加法题总是这样的,每一次都用到了对10取整算进位值,取余算个位值
while(p!=NULL || q!=NULL){
int x = (p!=NULL)? p->val :0; // ?问号的用法很好,意思是如果之前的()里面成立,就赋值第二个,不成立三
int y =(q!=NULL)? q->val :0; // 由于这个问号的写法避免了给数赋值情况下很多的if/else
int sum = x + y + carry;
carry = sum/10;
//这里赋值给下一个的用法想明白了,一开始的时候无论如何都会存在一个,那后面的指针节点都是生成的,规则是每一
//次要赋值的时候就生成一个,所以要么前面空一个要么末尾空一个,很精妙
curr->next = new ListNode(sum%10); //这里的生成新节点只能背一下了吧
if(p!=NULL) p=p->next; //三个节点的各自移位
if(q!=NULL) q =q->next;
curr = curr->next;
}
if(carry!=0) curr->next = new ListNode(carry);
return dummyHead->next;
}
};