题目链接:两数相加
题意:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
题解:每次加两个链表当前节点的值,有进位就标记一下,下次加就进位。(这个题比较好的是只进1位)
最开始写了一个十分冗余的代码。。遍历至其中一个为空就跳出来。然后找不空的链表继续做处理。
后面做了一个优化,在循环里去判断链表是不是为空。处理到当前链表是空的,值更新为0,这个链表就不往下走了。
还有一个地方要注意,最后链表全部加完后要判断是不是还有进位,还有进位的话要处理的。
代码:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { 12 ListNode *ans = new ListNode(0); 13 ListNode *res = ans; 14 15 int carry = 0; //进位 16 int num = 0,num1 = 0,num2 = 0; 17 18 while(l1 || l2 || carry){ 19 if(l1){ 20 num1 = l1->val; 21 l1 = l1->next; 22 } 23 else num1 = 0; 24 25 if(l2){ 26 num2 = l2->val; 27 l2 = l2->next; 28 } 29 else num2 = 0; 30 31 num = num1 + num2 + carry; 32 if(num >= 10){ 33 num -= 10; 34 carry = 1; 35 } 36 else carry = 0; 37 38 res->next = new ListNode(num); 39 res = res->next; 40 } 41 42 return ans->next; 43 44 } 45 };