首页 > 其他 > 详细

每日刷题191120

时间:2019-11-20 19:00:31      阅读:81      评论:0      收藏:0      [点我收藏+]

博主渣渣一枚,刷刷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;
        }

 

每日刷题191120

原文:https://www.cnblogs.com/dogtwo0214/p/11899528.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!