Leetcode 2 两数相加
一、题目
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。
可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
二、解法
以逆序链表的方式存储数字,非常适合于两数相加。这时候,链表头代表数字的最低位,只需从头向尾遍历,依次相加进位即可。
以最短的数的链表为终点,然后再将较长的数的后续位加入新的链表中。
Python版:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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语言版:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | # 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; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理