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

    题目


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

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

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

    示例:

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

    我的解法(不会...)


    首先看懂题目中给的链表

    1 // Definition for singly-linked list.
    2 struct ListNode {
    3     int val;
    4     ListNode *next;
    5     ListNode(int x) : val(x), next(NULL) {}
    6 };
    • 链表有两个成员,val 和 next 链表(指向下一个元素)
    • 链表有一个构造函数

    参考解法


    解法一(有点问题)

     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 vHead(0), *p = &vHead;
    13         
    14         int flag = 0;
    15         while (l1 || l2){
    16             int tmp = 0;
    17             if (l1 != nullptr) tmp += l1->val;
    18             if (l2 != nullptr) tmp += l2->val;
    19             tmp += flag;
    20             flag = tmp / 10;
    21             tmp = tmp % 10;
    22 
    23             ListNode *next = l1 ? l1 : l2;
    24             if (next == nullptr) next = new ListNode(tmp);
    25             next->val = tmp;
    26 
    27             p->next = next;
    28             p = p->next;
    29             l1 = l1 ? l1->next : nullptr;
    30             l2 = l2 ? l2->next : nullptr;
    31         }
    32         return vHead.next;
    33     }
    34 };
    • 如何给链表添加新元素?第 27, 28 行,首先是在尾节点后添加新的结点,然后再更新尾节点。
    • c++ 的三元运算符。
    • 第 23 行,机智的用 l1 或者 l2 给 next 临时赋值,更简单些。
    • ......(应该还没有完全理解...)

    解法二(没有问题)

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
             int carry=0;
            int sum=0;
            ListNode newhead(0);
            ListNode* nownode=&newhead;
            while(l1||l2||carry)
            {
                sum=(l1?l1->val:0)+(l2?l2->val:0)+carry;
                carry=sum/10;
                nownode->next=new ListNode(sum%10);
                nownode=nownode->next;
    
                l1=l1?l1->next:l1;
                l2=l2?l2->next:l2;
            }
            
            return newhead.next;
        }
    };
  • 相关阅读:
    代码间距的由来和解决方法
    径向渐变
    倒计时原理
    javascript原型模式理解
    倒计时原理和折叠收缩
    highcharts注意事项
    jsp注释前台不可见
    启动Tomcat任何程序都报错
    面试题
    eclipse不自动弹出提示(alt+/快捷键失效)
  • 原文地址:https://www.cnblogs.com/kurrrr/p/13144075.html
Copyright © 2011-2022 走看看