zoukankan      html  css  js  c++  java
  • LeetCode 2 两数相加

    链接:https://leetcode-cn.com/problems/add-two-numbers

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

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

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

    示例:

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

    这道题呢,简化了难度,因为链表的顺序就是我们平时计算两个数之和的顺序,都是从低位开始加。比如平时我们计算342+465,也是先计算2+5,对吧~

    然后求的和变成一个新的结点,在组合新链表的时候,也不必采用头插法,因为返回的链表也是倒序哈哈哈。

    要注意的有两个点,一个是有进位的情况,我们可以用一个变量来表示进位,进位就是sum/10,而结点的值是sum%10。

    还有就是当链表长度不一样时,如果链表遍历到空了,我们把它的值记为0就好~

    对了,不要忘记加上最后最后一步的进位噢,可以在while循环条件里设置,当carry为1时,继续再循环一次即可!

    c++代码如下:

     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         ListNode* l3 = new ListNode(-1);
    13         auto dummy = l3;
    14         int carry = 0;
    15         
    16         while(l1 || l2 || carry){
    17             int p = l1 ? l1->val : 0;
    18             int q = l2 ? l2->val : 0;
    19             int sum = p + q + carry;
    20             carry = sum / 10;
    21             l3->next = new ListNode(sum % 10);
    22             l3 = l3->next;
    23             if(l1) l1 = l1->next;
    24             if(l2) l2 = l2->next;
    25         }
    26         return dummy->next;
    27     }
    28 };
  • 相关阅读:
    简单的三级联动练习
    JavaScript中定时器的暂停和继续
    关于ajax网络请求的封装
    关于JS历史
    KVC中setValuesForKeysWithDictionary:
    collectionView 中cell间距设置建议
    iOS中你必须了解的多线程
    iOS中关于动态Tableview中的cell数据传输的多线程问题解决之拙见
    Touch
    Filemanager 的使用
  • 原文地址:https://www.cnblogs.com/hellosnow/p/12153295.html
Copyright © 2011-2022 走看看