给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
C++题解
/**
* 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) {
// i为l1节点的值 j为j2节点的值 carry保存进位
int i = 0, j = 0, carry = 0;
// result 保存返回结果链表的头指针 pt则为结果链表的当前节点
struct ListNode *result, *pt;
result = pt = NULL;
// 当l1和l2和进位只要有一个不为空就继续循环
while(carry||l1||l2){
//取出对应的值 防止两条表长度不一致
if(l1)
i = l1->val;
if(l2)
j = l2->val;
// 计算当前节点值
struct ListNode *temp = new ListNode((i + j + carry) % 10);
// 计算进位
carry = (i + j + carry) / 10;
// 看是不是最低位
if(result != NULL)
pt->next = temp;
else
result = temp;
// 更新指向节点
pt = temp;
// 更新指针 防止两条链表长度不一致
if(l1)
l1 = l1->next;
if(l2)
l2 = l2->next;
// 需重置i和j
i = j = 0;
}
return result;
}
};
C题解
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
int i = 0, j = 0, carry = 0;
struct ListNode *result, *pt;
result = pt = NULL;
while(carry||l1||l2){
if(l1){
i = l1->val;
}
if(l2){
j = l2->val;
}
struct ListNode *temp = (struct ListNode *)malloc(sizeof(struct ListNode));
temp->val = (i + j + carry) % 10;
temp->next = NULL;
carry = (i + j + carry) / 10;
if(result != NULL)
pt->next = temp;
else
result = temp;
pt = temp;
if(l1)
l1 = l1->next;
if(l2)
l2 = l2->next;
i = j = 0;
}
return result;
}
Python题解
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
result = None
pt = None
carry = 0
while(l1 or l2 or carry):
i = l1.val if l1 else 0
j = l2.val if l2 else 0
temp = ListNode((i + j + carry) % 10)
carry = (i +j + carry) // 10
if result:
pt.next = temp
else:
result = temp
pt = temp
l1 = l1.next if l1 else l1
l2 = l2.next if l2 else l2
i = 0
j = 0
return result