题003 两数相加 200717

给出两个 非空 的链表用来表示两个非负的整数。

其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

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

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

输出:7 -> 0 -> 8

原因:342 + 465 = 807

链接:https://leetcode-cn.com/problems/add-two-numbers



先了解了下ListNode:

 * Definition for singly-linked list.

 * public class ListNode {

 *           public int val;

 *           public ListNode next;   //链表指向的下一个值的指针

 *           public ListNode(int x) { val = x; } //赋值

 * }

定义链表ListNode时,

1. 链表的首个值不能为0,当首个参数为0时,代表着链表为空。

2. 只需要定义一个ListNode xx = new ListNode(0);即可。即只定义一个空链表。

3. 不需要定义长度 。

赋值时,

1. 通过xx.next = new ListNode(4);来赋值,注意此时是赋值给下一个指针指向的位置,此时此链表一个值,值为4。

2. 通过一个链表指向原链表地址,赋值完成时,打印原链表的指针地址,获取所有值。

取值时,

1. 取第一个值时,只需要xx.val即可。

2. 取第二或之后的值时,需要xx = xx.next;int x = xx.val;这个方式取值。



解题:  时间复杂度:O(max(m,n))  m 和 n 分别表示 l1 和 l2 的长度

执行用时:152 ms   内存消耗:27.7 MB

    public class Solution

    {

        public ListNode AddTwoNumbers(ListNode l1, ListNode l2)

        {

            int val = 0;

            ListNode prenode = new ListNode(0);  // 初始化

            ListNode lastnode = prenode;  //定义循环用的对象

            while (l1 != null || l2 != null || val != 0)

            {

                val = val + (l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val); //计算两数之和 并加上前一轮需要进位的值

                lastnode.next = new ListNode(val % 10); //计算个位,将数据添加到循环链表中

                lastnode = lastnode.next;  //循环用的对象赋值为循环链表中的下一个对象

                val = val / 10;//计算十位并赋值

                //l1 l2 指向自己在链表中对应的下一个值

                l1 = l1 == null ? null : l1.next;

                l2 = l2 == null ? null : l2.next;

            }

            return prenode.next;

        }

    }

    class Test

    {

        static ListNode generateList(int[] vals)

        {

            ListNode res = null;

            ListNode last = null;

            foreach (var val in vals)

            {

                if (res == null)

                {

                    res = new ListNode(val);

                    last = res;

                }

                else

                {

                    last.next = new ListNode(val);

                    last = last.next;

                }

            }

            return res;

        }

        static void printList(ListNode l)

        {

            while (l != null)

            {

                Console.Write($"{l.val}, ");

                l = l.next;

            }

            Console.WriteLine("");

        }

        static void Main()

        {

            var l1 = generateList(new int[] { 2, 5, 8 });

            var l2 = generateList(new int[] { 3, 6, 9, 1 });

            printList(l1);

            printList(l2);

            Solution s = new Solution();

            var sum = s.AddTwoNumbers(l1, l2);

            printList(sum);

        }

  }

你可能感兴趣的:(题003 两数相加 200717)