• LeetCode刷题191120


    博主渣渣一枚,刷刷leetcode给自己瞅瞅,大神们由更好方法还望不吝赐教。题目及解法来自于力扣(LeetCode),传送门

    算法:

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

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

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

    示例:

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

      一开始的思路很简单,其实就是对应位置上的数字相加,如果有进位那就再下个位置上+1,其实就是普通的加法。

    public ListNode AddTwoNumbers(ListNode l1, ListNode l2)
            {
                var value = (l1.val + l2.val) % 10;
                var flag = (l1.val + l2.val) / 10 > 0;
    
                var result = new ListNode(value);
    
                var returnResult = result;
    
                if (flag)
                {
                    result.next = new ListNode(1);
                }
                
                var a = l1.next;
                var b = l2.next;
    
                while (a != null || b != null)
                {
                    var temp = (a != null ? a.val : 0)
                        + (b != null ? b.val : 0)
                        + (result.next != null ? result.next.val : 0);
    
                    var addNums = temp % 10;
                    var addFlag = temp / 10 > 0;
    
                    if (result.next == null)
                    {
                        result.next = new ListNode(addNums);
                    }
                    else
                    {
                        result.next.val = addNums;
                    }
    
                    a = a!=null ? a.next : null;
                    b = b!=null ? b.next : null;
                    result = result.next;
    
                    if (addFlag)
                    {
                        result.next = new ListNode(1);
                    }
                }
    
                return returnResult;
            }

    二,略微整理了一下,把第一次的判断免去了。这里要小心一下指向的问题,ListNode是一个引用类型,其实指向的是存在堆内存的地址。所以一开始的result与returnResult其实是指向的同一个地址。这样为next赋值时要小心,如果一开始给的值是null,会导致链表断掉。

    public ListNode AddTwoNumbers(ListNode l1, ListNode l2)
            {
                ListNode result = new ListNode(0);
                var returnResult = result;
    
                var a = l1;
                var b = l2;
    
                while (a != null || b != null)
                {
                    var temp = (a != null ? a.val : 0)
                        + (b != null ? b.val : 0)
                        + (result.next != null ? result.next.val : 0);
    
                    var addNums = temp % 10;
                    var addFlag = temp / 10 > 0;
    
                    result.next = new ListNode(addNums);
                    result = result.next;
    
                    a = a!=null ? a.next : null;
                    b = b!=null ? b.next : null;
    
                    if (addFlag)
                    {
                        result.next = new ListNode(1);
                    }
                }
    
                return returnResult.next;
            }
  • 相关阅读:
    好用的软件记录
    微信小程序 设计理念指南
    开启Python之路
    升级到iOS9之后的相关适配
    ARC模式下的内存泄露问题
    Git 源代码管理工具
    SVN版本控制系统
    单例 singleton
    双击改变图片大小和多点触摸改变图片大小
    循环引用 -- id 为什么是 assign 而不是 retain
  • 原文地址:https://www.cnblogs.com/dogtwo0214/p/11899528.html
Copyright © 2020-2023  润新知