给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头
思路
根据博客大佬的代码写的,学习使用。
从链表的左边(也就是数字的低位开始),两个链表对应位置的数分别相加,若两数相加之和产生进位carry(>10),则需要往高一位进1,则高位不仅仅是两个数,还要加上低位产生的进位carry。以此进行下去。
代码
struct ListNode
{
int val;
ListNode *next;
//构造函数,用来赋值
ListNode(int x) {
val = x;
}
// ListNode(int x) : val(x), next(NULL) {} //这个也是构造函数,与上句作用相同,用来赋值
};
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
ListNode *tmp=NULL;
ListNode *result=NULL;
int carry=0; //设置进位
//或运算也包含了l1和l2数位不一样的情况
while(l1 !=NULL || l2!=NULL || carry!=0)
{
int sum=(l1==NULL?0:l1->val)+(l2==NULL?0:l2->val)+carry;
carry=sum/10;
ListNode *node = new ListNode(sum % 10); //构造函数产生新的节点,并进行赋值
node->val=sum%10;
//依次连接存放结果的节点,形成链表
if(tmp==NULL)
{
tmp=node;
result=tmp;
} else
{
tmp->next=node;
tmp=tmp->next;
}
l1= l1==NULL ? 0:l1->next;
l2= l2==NULL ? 0:l2->next;
}
return result;
Come On!Man