您的位置:首页 > 其它

2. 两数相加

2018-03-18 20:47 176 查看

给定两个非空链表来代表两个非负数,位数按照逆序方式存储,它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
/**
* Definition for singly-linked list.
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *ans = new ListNode(0);  //答案串
ListNode *head = ans;//记录一下答案串的首地址
int pos = 0; //标记进位
while (l1 && l2) {//现将相同的位置加上
int cnt = l1 -> val + l2 -> val + pos;
pos = cnt > 9 ? 1 : 0;
ans -> val = cnt % 10;
l1 = l1 -> next;
l2 = l2 -> next;
if (l1 && l2) {
ans -> next = new ListNode(0);
ans = ans -> next;
} else {
break;
}
}
// 然后处理后边的数此时ans不是空的,而是指向最后一个节点
if (l1 == NULL && l2 == NULL) {//加完了
if (pos) {
ans -> next = new ListNode(0);
ans = ans -> next;
ans -> val = pos;
}
} else if (l1 == NULL) {//第一个链表用完了
while (l2) {//用完
ans -> next = new ListNode(0);
ans = ans -> next;
int cnt = l2 -> val + pos;
pos = cnt > 9 ? 1 : 0;
ans -> val = cnt % 10;
l2 = l2 -> next;
}
if (pos) {
ans -> next = new ListNode(0);
ans = ans -> next;
ans -> val = pos;
}
} else if (l2 == NULL) {
while (l1) {//用完
ans -> next = new ListNode(0);
ans = ans -> next;
int cnt = l1 -> val + pos;
pos = cnt > 9 ? 1 : 0;
ans -> val = cnt % 10;
l1 = l1 -> next;
}
if (pos) {
ans -> next = new ListNode(0);
ans = ans -> next;
ans -> val = pos;
}
}
ans = head;
return ans;
}
};

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: