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; }