最近更新于 2024-05-05 14:19
题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
Python3
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: head_node = node = ListNode() # 保存结果值的链表。头部和用于迭代的节点 carry = 0 # 进位数 while l1 or l2: add1 = l1.val if l1 else 0 add2 = l2.val if l2 else 0 sum = add1 + add2 + carry carry = sum // 10 # 取 sum 的十位即进位值 1 或 0 node.next = ListNode(sum % 10) # 取 sum 的个位为当前节点值,每个节点值的范围:0~9 node = node.next l1 = l1.next if l1 else None l2 = l2.next if l2 else None if carry: node.next = ListNode(carry) # 原加数最高位存在再进一位的情况 return head_node.next
C
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ typedef struct ListNode ListNode; /** @brief 创建节点 @param val 创建节点并赋值,不赋值则需要指定为 0 @return 返回创建的节点 */ ListNode *create_node(int val) { ListNode *new_node = (ListNode *) malloc(sizeof(ListNode)); new_node->val = val; new_node->next = NULL; return new_node; } ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode *head_node = create_node(0); ListNode *node = head_node; int carry = 0; while (l1 != NULL || l2 != NULL) { int add1 = l1 != NULL ? l1->val : 0; int add2 = l2 != NULL ? l2->val : 0; int sum = add1 + add2 + carry; carry = sum / 10; node->next = create_node(sum % 10); node = node->next; l1 = l1 != NULL ? l1->next : NULL; l2 = l2 != NULL ? l2->next : NULL; } if (carry) { node->next = create_node(carry); } return head_node->next; }
两数相加