2.力扣题库—两数相加
这个题目的知识点是对链表的操作,把一个多位数灿在链表内,从低位开始存入,一次后边存放的是高位数字。把两个链表中的数字相加,我们要的是相加的结果,存在一个新的链表中。相加的过程中按照数学来说有结果位和进位,就是加和的结果除10的余数是结果,商就是进位。
整个执行的过程如下
分两种情况:
①有一个数是0,那就可以直接返回另一个数所在的链表,也就是
if(l1->val == 0 && !l1->next) return l2;
if(l2->val == 0 && !l2->next) return l1;
②就是需要计算的情况了
首先,新创一个结点,用这个结点当做存储结果的头结点;并且用一个工作结点用来移动
ListNode *ansHead = new ListNode(随便一个数字)
因为最后结果是从头结点后边的一个结点来看
ListNode *point = ansHead;
定义进位
int carry = 0;//初始进位是0;
在进行运算的过程中,我们需要一位一位的进行运算,所以就有了提取对应位数字的这个步骤
v1 = l1 ? l1->val : 0;
v2 = l2 ? l2->val : 0;
提取之后相加,相加的结果就需要存到新的链表里,也需要提取出来相应的进位,就有
point->next = new ListNode(sum%10);
point = point->next;
carry = sum/10;
至此这个节点上的计算就算结束了,就需要去去下一个节点的数了,进行到next上
if(l1) l1 = l1->next;
if(l2) l2 = l2->next;
最后所有的都加完之后需要判断一下最高位加过之后是否还有进位,有的话还是需要进行存储
if(carry) point->next = mew ListNode(1);
整体程序如下:
if(l1->val == 0 && !l1->next) return l2;
if(l2->val == 0 && !l2->next) return l1;
ListNode *ansHead = new ListNode(-1);
ListNode *point = ansHead;
int carry = 0;
while(l1 || l2){
int v1 = l1 ? l1->val : 0;
int v2 = l2 ? l2->val : 0;
int sum = v1 + v2 + carry;
carry = sum / 10;
point->next = new ListNode(sum%10);
point = point->next;
if(l1) l1 = l1->next;
if(l2) l2 = l2->next;
}
if(carry) point->next = new ListNode(1);
return ansHead->next;