Leetcode 2 两数相加
一、题目
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。
可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
二、解法
以逆序链表的方式存储数字,非常适合于两数相加。这时候,链表头代表数字的最低位,只需从头向尾遍历,依次相加进位即可。
以最短的数的链表为终点,然后再将较长的数的后续位加入新的链表中。
Python版:
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
upper_val = 0
dummy = ListNode(0)
cur = dummy
while l1 and l2:
value = l1.val + l2.val + upper_val
upper_val = value // 10
tmp_node = ListNode(value % 10)
cur.next = tmp_node
cur = tmp_node
l1, l2 = l1.next, l2.next
remain_l = l1 if l1 else l2
while remain_l:
value = remain_l.val + upper_val
upper_val = value // 10
tmp_node = ListNode(value % 10)
cur.next = tmp_node
cur = tmp_node
remain_l = remain_l.next
if upper_val > 0:
tmp_node = ListNode(upper_val)
cur.next = tmp_node
return dummy.next
C语言版:
# include <stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode* l = NULL;
struct ListNode* cur = NULL;
// struct ListNode* tmp = NULL;
l = malloc(sizeof(struct ListNode));
l->val = 0;
l->next = NULL;
cur = l;
int value = 0;
int upperVal = 0;
while (l1 != NULL && l2 != NULL) {
value = l1->val + l2->val + upperVal;
upperVal = value / 10;
value = value % 10;
struct ListNode* tmp_node = malloc(sizeof(struct ListNode));
tmp_node->val = value;
tmp_node->next = NULL;
cur->next = tmp_node;
cur = cur->next;
l1 = l1->next;
l2 = l2->next;
}
if (l1 == NULL) {
while (l2 != NULL ) {
value = l2->val + upperVal;
upperVal = value / 10;
l2->val = value % 10;
cur->next = l2;
cur = cur->next;
l2 = l2->next;
}
}
if (l2 == NULL) {
while (l1 != NULL ) {
value = l1->val + upperVal;
upperVal = value / 10;
l1->val = value % 10;
cur->next = l1;
cur = cur->next;
l1 = l1->next;
}
}
if (upperVal > 0) {
struct ListNode* node = malloc(sizeof(struct ListNode));
node->val = upperVal;
node->next = NULL;
cur->next = node;
}
return l->next;
}

浙公网安备 33010602011771号