• 剑指 Offer II 025. 链表中的两数相加


    给定两个 非空链表 l1和 l2 来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

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

    示例1:

    输入:l1 = [7,2,4,3], l2 = [5,6,4]
    输出:[7,8,0,7]
    示例2:

    输入:l1 = [2,4,3], l2 = [5,6,4]
    输出:[8,0,7]
    示例3:

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

    提示:

    链表的长度范围为 [1, 100]
    0 <= node.val <= 9
    输入数据保证链表代表的数字无前导 0
     

    进阶:如果输入链表不能修改该如何处理?换句话说,不能对列表中的节点进行翻转。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/lMSNwu


    题解:难点在链表的处理上,首先先用两个栈把两个链表反转过来,然后就是很基础的逐个相加再进位。

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode() : val(0), next(nullptr) {}
     7  *     ListNode(int x) : val(x), next(nullptr) {}
     8  *     ListNode(int x, ListNode *next) : val(x), next(next) {}
     9  * };
    10  */
    11 class Solution {
    12 public:
    13     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    14             stack<int> s1,s2;
    15             ListNode* a=new ListNode;//新建一个链表头节点。因为链表定义了构造方法,会多一个 头指针有值为0;
    16             int b=0//进位数
    17             int now=0;//当前数
    18             while(l1!=nullptr) //当前节点值不为空,加入栈中。
    19             {
    20                s1.push(l1->val);
    21                l1=l1->next;
    22             }
    23              while(l2!=nullptr)
    24             {
    25                s2.push(l2->val);
    26                l2=l2->next;
    27             }
    28 
    29             while(!s1.empty()||!s2.empty())//当栈都不为空时候
    30             {
    31                 now=0;   
    32                 if(!s1.empty()&&!s2.empty()) 
    33                 {
    34                     now+=s1.top()+s2.top();
    35                     s1.pop();s2.pop();
    36                     
    37                 }
    38                 else if(!s2.empty())
    39                 {
    40                     now+=s2.top();s2.pop();
    41                 }
    42                 else if(!s1.empty())
    43                 {
    44                     now+=s1.top();s1.pop();
    45                 }
    46                 
    47                 ListNode* neww=new ListNode;  //创建一个新节点
    48                 neww->val=((b+now)%10);   
    49                 neww->next=a->next;  //用链表的头插法,新节点先指向头节点的指向的
    50                 a->next=neww;//头指针的指向  改为新节点
    51                 b=(b+now)/10;//更新进位位
    52             }
    53 
    54         if(b){//存最后的进位
    55              ListNode* neww=new ListNode;
    56                 neww->val=(b);
    57                 neww->next=a->next;
    58                  a->next=neww;
    59         }
    60         return a->next;//由于头指针有值,然后时候我们要去掉头指针,直接指向第一个数
    61     }
    62 };
  • 相关阅读:
    iphone 使用委托(delegate)在不同的窗口之间传递数据
    创建单键模式的类
    读入Plist文件中的信息
    C#读取Excel,取值为空的解决办法!
    ORACLE 常见的数据类型
    ArcGISServer 将内网地图服务映射修改外网可以访问的地图服务
    C#中获取当前路径的几种方法
    sql server2005登录出错问题(转载)
    (转载)服务器控件的生命周期
    ORACLE 中ROWNUM用法总结(转载)
  • 原文地址:https://www.cnblogs.com/sylvia1111/p/15945082.html
Copyright © 2020-2023  润新知