C++&Python 描述 LeetCode 2.两数相加

Posted 亓官劼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++&Python 描述 LeetCode 2.两数相加相关的知识,希望对你有一定的参考价值。

C++&Python 描述 LeetCode 2.两数相加

   大家好,我是亓官劼(qí guān jié ),在【亓官劼】公众号、CSDN、GitHub、B 站、华为开发者论坛等平台分享一些技术博文。放弃不难,但坚持一定很酷!时光荏苒,未来可期,加油~

  如果喜欢博主的文章可以关注博主的个人公众号【亓官劼】(qí guān jié),如果有需要找博主的话可以在公众号后台留言。建了个小交流群,Q 群:545611263,要进微信群的话可以加我 V:qiguanjie2015备注拉群即可。
微信公众号关注二维码
  《leetcode 刷题系列》,博主将从第一题开始,每天更新 1-5 题的每日刷题情况,有兴趣的小伙伴可以一起呀~每题博主会尽量加一些解题思路的分析和 C++&python 代码的实现。每日在微信公众号【亓官劼】定时更新,其他平台视情况而定,有兴趣一起刷题的小伙伴可以关注公众号来一起卷起来呀。

题目

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

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

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

示例 1:

img

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:

  • 每个链表中的节点数在范围 [1, 100]
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零

解题思路 模拟

这里给定两个用链表表示的两个数,让我们求两个数相加的和。这里是逆序给的,即先是个位,然后十位等…按小学数学的方法按位相加即可,遇到超过十的则进位,如果一个链表到头了,而另一个链表还没结束,则直接加上即可。

这里模拟的时候我们需要注意几种情况:

  • 如果两个链表有一个结束了,另一个还没结束,则结束的每位当做 0 进行计算即可
  • 要主要当两个链表都结束了,但是进位不为 0 的情况。

为方便实现,我们添加一个虚拟头结点,在最后返回的时候记得去掉。

算法实现 C++

这里在实现的时候,我们两个链表当前的数分别初始化为0,如果当前链表非空,则置为当前值。这样做的话可以将有一个链表已经走完的情况与两个链表都在的情况进行统一。同时还可以考虑进位非 0 的情况。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* res = new ListNode(-1);
        ListNode* p = res;
        int cnt = 0;
        while(l1 || l2 || cnt){
            int a = 0, b = 0;
            if(l1) a = l1->val, l1 = l1->next;
            if(l2) b = l2->val, l2 = l2->next;
            p->next = new ListNode((a + b + cnt) % 10);
            cnt = (a + b + cnt) / 10;
            p = p->next;
        }
        return res->next;
    }
};

算法实现 Python

# 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:
        res = ListNode(-1)
        p = res
        cnt = 0
        while(l1 or l2 or cnt):
            a = 0
            b = 0
            if(l1):
                a = l1.val
                l1 = l1.next
            if(l2):
                b = l2.val
                l2 = l2.next
            p.next = ListNode((a+b+cnt)%10)
            cnt = (a + b + cnt) // 10
            p = p.next
        return res.next

以上是关于C++&Python 描述 LeetCode 2.两数相加的主要内容,如果未能解决你的问题,请参考以下文章

用队列实现栈

Leetcod6. Z 字形变换(规律题)

C++&Python描述 LeetCode C++&Python描述 LeetCode 165. 比较版本号

C++&Python描述 LeetCode C++&Python描述 LeetCode 剑指 Offer 22. 链表中倒数第k个节点

Bit Manipulation

C++&Python 描述 LeetCode 8. 字符串转换整数 (atoi)