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;
        }

 

posted @ 2019-11-20 18:04  DogTwo  阅读(101)  评论(0编辑  收藏  举报