• LeetCode 2. 两数相加(Add Two Numbers)


    题目描述

    给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

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

    示例:

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

    解题思路

    由于两数相加可能有进位,所以在相加时既要考虑上一位的进位,又要传递给下一位计算时的进位,用递归来求解,具体可分为以下几种情况:

    • 当两个链表均不为空时,计算两个节点值与上一位进位的和sum,取sum的个位数构建新节点,更新进位为sum的十位数,令本节点的next指针指向下一位求和返回的节点
    • 当两个链表其中一个为空时,计算不为空的节点值与上一位进位的和sum,更新进位为sum的十位数。若进位不为0,取sum的个位数构建新节点,令本节点的next指针指向下一位求和返回的节点,注意只传递不为空的链表;若进位为0,则直接更新不为空节点的值为sum,此时此链表之后的所有高位值都不会更新,因此返回此节点
    • 若两个链表都为空,判断进位是否为0.若进位为0,直接返回NULL;否则构建值为进位值的新节点,并返回此结点

    代码

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    12         return addNum(l1, l2, 0);
    13     }
    14     ListNode* addNum(ListNode* l1, ListNode* l2, int add){
    15         if(l1 && l2){
    16             int sum = add + l1->val +l2->val;
    17             add = sum/10;
    18             ListNode* res = new ListNode(sum%10);
    19             res->next = addNum(l1->next, l2->next, add);
    20             return res;
    21         }
    22         else if(l1){
    23             int sum = l1->val + add;
    24             add = sum/10;
    25             if(add){
    26                 ListNode* res = new ListNode(sum%10);
    27                 res->next = addNum(l1->next, l2, add);
    28                 return res;
    29             }
    30             else{
    31                 l1->val = sum;
    32                 return l1;
    33             } 
    34         }
    35         else if(l2){
    36             int sum = l2->val + add;
    37             add = sum/10;
    38             if(add){
    39                 ListNode* res = new ListNode(sum%10);
    40                 res->next = addNum(l1, l2->next, add);
    41                 return res;
    42             }
    43             else{
    44                 l2->val = sum;
    45                 return l2;
    46             } 
    47         }
    48         else{
    49             if(add){
    50                 ListNode* res = new ListNode(add);
    51                 return res;
    52             }
    53             else return NULL;
    54         }
    55     }
    56 };
  • 相关阅读:
    扩展VirtualBox虚拟机磁盘容量
    Java实现莱布尼兹问题
    Java实现子序列问题
    Java实现子序列问题
    Java实现子序列问题
    Java实现子序列问题
    Java实现子序列问题
    第九届蓝桥杯JavaC组省赛真题
    第九届蓝桥杯JavaC组省赛真题
    第九届蓝桥杯JavaC组省赛真题
  • 原文地址:https://www.cnblogs.com/wmx24/p/9141193.html
Copyright © 2020-2023  润新知