2.两数相加
问题描述
给定两个链表分别代表两个非负整数,链表的每个结点分别存储整数的每位数字,且是逆序存储,即:数字最低位存储在链表表头,数字最高位存储在链表表尾。求解这两个整数的和并以相同的链表形式返回计算的结果。
例如: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
下面贴出官方代码(C++)
class Solution {
public:
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
ListNode preHead(0), *p = &preHead;
int carry = 0;
while (l1 || l2 || carry) {
int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + carry;
carry = sum / 10;
p->next = new ListNode(sum % 10);
p = p->next;
l1 = l1 ? l1->next : l1;
l2 = l2 ? l2->next : l2;
}
return preHead.next;
};
注意在设计好链表数据结构之后,考虑到ListNode类有一个构造函数,所以要这样声明一个preHead节点。这一点和C语言有一些不同
ListNode preHead(0), *p = &preHead;
因为返回的是新创建的链表,所以记得new申请空间
p->next = new ListNode(sum % 10);
注意l1和l2是空指针的情况,当时提交的时候主要是空指针出错,所以用正则表达式判断
我自己是这么写的,参考了网上一些大牛的答案
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* p1 = l1, *p2 = l2;
int add = 0;
ListNode merge (0);
ListNode *preNode = &merge;
while(p1||p2||add){
ListNode *node = new ListNode(0);
node->val = ((p1?p1->val:0)+(p2?p2->val:0)+add)%10;
add = ((p1?p1->val:0)+(p2?p2->val:0)+add)/10;
p1 = (p1&&p1->next)?p1->next:NULL;
p2 = (p2&&p2->next)?p2->next:NULL;
preNode->next = node;
preNode = node;
}
return merge.next;
}
};