LeetCode 3 两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
解题思路:
从链表头开始, 依次相加, 然后每次判断需不需要进位, 如果需要进位, 使用carry 记录值为1 .
并将当前位对10 取余
注意两个链表不一样长, 其中一个链表为空, 最后一位相加超出链表长度 这三种情况.
代码:
ListNode* Sumlist = new ListNode(0); ListNode *p1 = l1, *p2 = l2 ,*curr=Sumlist; int carry = 0; //两个链表不一样长, 必须同时为空退出循环 while (p1!=NULL||p2!=NULL) { //如果一个链表为空, 则值等于0 int x = (p1 != NULL) ? p1->val : 0; int y = (p2 != NULL) ? p2->val : 0; //每次都要加上进位. int sum = x + y+carry; carry = sum / 10; sum = sum % 10; curr->next = new ListNode(sum); curr = curr->next; p1 = (p1 != NULL) ? p1->next : NULL; p2 = (p2 != NULL) ? p2->next : NULL; } //循环结束时, 还有进位.则往下多加一个链表 if (carry > 0) { curr->next = new ListNode(carry); } return Sumlist->next;