• leecode2:两数相加


    1.题目描述:

      给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。

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

    2.示例

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

    3.解析

    (1)此题难度不大,记录此题是想记录一个思路。在计算两数之和时,由于加法进位仅可能使得两个加数中最长的加数进位。所以使用链表表示加法时,逆序排列加数,可以有很好的扩展性,无需进行移动。

    由此可想,在一些单方向扩展的数据结构中使用链表,可以避免移动数据。

    (2)另外此题,编写后总结如下问题:

      <1>十进制加法中,两数之和的进位值最大为1:先考虑低位可能产生的最大进位值情况:9+9=18,最大进位值是1.在其高一位上,可能产生的最大进位且本位最高的仍为:9+9=18.由于8+1<10,故不会产生进位。从而得出结论。

      <2>另外注意,进位至位数超过两加数的最大位数时,对最高位的处理。

    4.最后给出代码

    /**
     * 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) {
    
            bool carryMark = false; //进位符
            struct ListNode* lastNode = nullptr;  //存储上一个结点
            struct ListNode* head = nullptr;    //存储首结点
            while(l1!=nullptr||l2!=nullptr||carryMark){
                int currentBitValue = 0;
                if(carryMark){
                    currentBitValue +=1;
                }
                if(l1!=nullptr&&l2!=nullptr){
                    currentBitValue =currentBitValue+ (l1->val)+(l2->val);
                    l1 = l1->next;
                    l2 = l2->next;
                }
                else if(l1!=nullptr){
                    currentBitValue =currentBitValue + (l1->val);
                    l1 = l1->next;
                }
                else if(l2!=nullptr){
                    currentBitValue =currentBitValue + (l2->val);
                    l2 = l2->next;
                }
                else{
                    //最高位进位为1
                }
                if(currentBitValue>=10){
                    currentBitValue =currentBitValue %10;
                    carryMark = true;
                }else{
                    carryMark = false;
                }
                struct ListNode* currentNode = new struct ListNode(currentBitValue);
                if(lastNode==nullptr){//如果上一个结点为空,则证明是第一个结点和。
                    head = currentNode;
                }else{
                    lastNode->next=currentNode;
                }
                lastNode = currentNode;
            }
            return head;
        }
    };
    
    
  • 相关阅读:
    币值转换
    抓老鼠啊!亏了还是赚了
    打印沙漏
    秋季学习总结
    记忆中最深刻的三位老师
    自我介绍
    docker 安装redis 和 mysql
    centos 安装docker
    celery的简单使用
    django redis配置和简单使用
  • 原文地址:https://www.cnblogs.com/fangexuxiehuihuang/p/14497038.html
Copyright © 2020-2023  润新知