LeetCode: 两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

C++题解

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        // i为l1节点的值 j为j2节点的值 carry保存进位
        int i = 0, j = 0, carry = 0;
        // result 保存返回结果链表的头指针 pt则为结果链表的当前节点
        struct ListNode *result, *pt;
        result = pt = NULL;
        // 当l1和l2和进位只要有一个不为空就继续循环
        while(carry||l1||l2){
            //取出对应的值 防止两条表长度不一致
            if(l1)
                i = l1->val;
            if(l2)
                j = l2->val;
            // 计算当前节点值
            struct ListNode *temp = new ListNode((i + j + carry) % 10);
            // 计算进位
            carry = (i + j + carry) / 10;
            // 看是不是最低位
            if(result != NULL)
                pt->next = temp;
            else
                result = temp;
            // 更新指向节点
            pt = temp;
            // 更新指针 防止两条链表长度不一致
            if(l1)
                l1 = l1->next;
            if(l2)
                l2 = l2->next;
            // 需重置i和j
            i = j = 0;        
        }
        return result;
    }
};

 

C题解

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
        int i = 0, j = 0, carry = 0;
        struct ListNode *result, *pt;
        result = pt = NULL;
        while(carry||l1||l2){
            if(l1){
                i = l1->val;
            }
            if(l2){
                j = l2->val;
            }
            struct ListNode *temp = (struct ListNode *)malloc(sizeof(struct ListNode));
            temp->val = (i + j + carry) % 10;
            temp->next = NULL;
            carry = (i + j + carry) / 10;
            if(result != NULL)
                pt->next = temp;
            else
                result = temp;
            pt = temp;
            if(l1)
                l1 = l1->next;
            if(l2)
                l2 = l2->next;
            i = j = 0;        
        }
        return result;
}

Python题解

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        result = None
        pt = None
        carry = 0
        while(l1 or l2 or carry):
            i = l1.val if l1 else 0
            j = l2.val if l2 else 0
            temp = ListNode((i + j + carry) % 10)
            carry = (i +j + carry) // 10
            if result:
                pt.next = temp
            else:
                result = temp
            pt = temp
            l1 = l1.next if l1 else l1
            l2 = l2.next if l2 else l2
            i = 0
            j = 0
        
        return result

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值