LeetCode练习2 两数相加

问题如下:

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

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

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

示例:

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

分析问题,本题是一个链表的问题。示例是输入两个三位数相加,这个三位数来自于链表的倒序组成的数,然后输出的结果也是这个和的个十百位上面的数。
首先,我们要排除非法链表的输入,即链表一和链表二 非空 且长度一致才可以。
      public static ListNode AddTwoNumbers(ListNode l1, ListNode l2)
        {
            ListNode result = new ListNode(0);

            if(l1 == null || l2 == null)
            {
                return null;
            }

            int l1Count = 0;
            ListNode lTmp = new ListNode(0);
            List<int> list1 = new List<int>();//用来临时存放数字
            List<int> list2 = new List<int>();//用来临时存放数字
            lTmp = l1;
            while(lTmp != null)
            {
                list1.Add(lTmp.val);
                l1Count++;
                lTmp = lTmp.next;
            }

            int l2Count = 0;
            lTmp = l2;
            while (lTmp != null)
            {
                list2.Add(lTmp.val);
                l2Count++;
                lTmp = lTmp.next;
            }

            int lcount = 0;
            if(l1Count > l2Count)
            {
                lcount = l1Count;
            }
            else
            {
                lcount = l2Count;
            }

            int carry = 0;//表示进位
            ListNode resultTmp = new ListNode(0);
            resultTmp = result;
            for (int i=0;i< lcount; i++)
            {
                int l1Num = 0;
                if (list1.Count > i)
                {
                    l1Num = list1[i];
                }
                int l2Num = 0;
                if(list2.Count > i)
                {
                    l2Num = list2[i];
                }
                int sum = l1Num + l2Num;
                if(carry > 0)
                {
                    sum += carry;
                }
                int num = 0;
                if(sum >= 10)
                {
                    num = sum - 10;
                    carry = 1;
                }
                else
                {
                    num = sum;
                    carry = 0;
                }

                resultTmp.next = new ListNode(num); //这里面比较难理解,链表传递的是地址。
                resultTmp = resultTmp.next;//所以一个链表移动位置,另外一个链表也跟着移动(但主链表是依次赋值)

            }

            if(carry > 0)
            {
                resultTmp.next = new ListNode(carry);
                resultTmp = resultTmp.next;
            }


            return result.next;
        }

 

posted @ 2019-02-25 10:36  雨飞  阅读(186)  评论(0)    收藏  举报