023-Add Two Numbers
2020-05-31 本文已影响0人
Woodlouse
备注
单链表节点定义如下:
struct ListNode {
int val;
ListNode *next;
ListNode(int x):
val(x),
next(nullptr) {
}
};
描述
现在有两个元素为单个非负整数的链表,链表中存储的数字是十进制的反序表示,把这两个数字相加,结果以链表的形式返回。
输入:(2->4->3) + (5->6->4)
返回:(7->0->8)
分析
此题目需要考虑:
1,加法的规则,考虑进位;
2,链表的遍历,在遍历时需要考虑空指针的问题;
链表的遍历:
1,初始值:两个指针p1,p2分别指向两个链表的起始位置;
2,如果p1==null,则取值为0,否则取值p1->val;p2也如此;
3,根据取值和当前的进位数字分别计算当前位置节点的值和最新的进位数字;
4,两个链表都已遍历完,如果进位大于0,则插入一个值为进位的节点;
实现
// Add Two Number
void addTwoNumber(ListNode *p1, ListNode *p2, ListNode *pResult)
{
int carry = 0;
ListNode *prev = pResult;
for (ListNode *v1 = p1, *v2=p2;
v1!=nullptr || v2!=nullptr;
v1= v1 ? v1->next : nullptr, v2=v2?v2->next:nullptr, prev=prev->next)
{
int val1 = v1 == nullptr ? 0 : v1->val;
int val2 = v2 == nullptr ? 0 : v2->val;
int sum = (val1 + val2 + carry)%10;
carry = (val1 + val2 + carry) / 10;
prev->next = new ListNode(sum);
}
if (carry) {
prev->next = new ListNode(carry);
}
}