对比我那又臭又长的代码。。。最后还在最后一个进位过不去。。。
高级的写法真的是高级高级又高级。。。
题目链接
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *head=nullptr,*tail=nullptr; //先设置2个初始结点,置为空(防止输入即为空)
int carry=0; //设置进位
while(l1||l2) //两个都遍历到结尾时才结束
{
int n1=l1?l1->val:0; //先判断是否为空,NT:为空则此数在加法中相当于1
int n2=l2?l2->val:0; //比先单个循环判断方便多了
int sum=n1+n2+carry; //对所求值加和,不能少进位
if(!head) head=tail=new ListNode(sum%10); //当头结点为空时,即为第一次遍历初始情况,对首尾同时创建节点,此时首尾指针是重合的
else{ //往后遍历时操作尾结点
tail->next=new ListNode(sum%10); //直接对总和取余处理,不用判断是否>=10
tail=tail->next; //尾指针向后移动
}
carry=sum/10; //直接用运算,不用判断后再用标志变量
if(l1) l1=l1->next; //未到结尾时逐步向后遍历
if(l2) l2=l2->next;
}
if(carry>0) tail->next=new ListNode(carry); //最后再判断最后一个进位的状态
return head;
}
}