字数:1493,阅读量:601

两数相加

题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 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;
}

发表评论