LeetCode-C#-0002.两数相加

0.声明

该题目来源于LeetCode
如有侵权,立马删除。
解法不唯一,如有新解法可一同讨论。

1.题目

0002两数相加
给你两个非空的链表,表示两个非负的整数,它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字0之外,这两个数都不会以0开头。

示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807

示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零

2.代码

namespace LeetCode_0002两数相加
{
    class Program
    {
        static void Main(string[] args)
        {
            var l1 = generateList(new int[] { 1, 5, 7 });
            var l2 = generateList(new int[] { 9, 9, 2, 9 });
            printList(l1);
            printList(l2);

            LeetCode_AddTwoNum latn = new LeetCode_AddTwoNum();
            var sum = latn.AddTwoNumbers(l1, l2);
            printList(sum);

            var sum1 = latn.AddTwoNumbers_1(l1, l2);
            printList(sum1);

            Console.ReadKey();
        }


        static ListNode generateList(int[] vals)
        {
            ListNode start = null;
            ListNode end = null;

            for (int i = 0; i < vals.Length; i++)
            {
                if (start == null)//开头为null时
                {
                    start = new ListNode(vals[i]);
                    end = start;//移动指针
                }

                else
                {
                    end.next = new ListNode(vals[i]);
                    end = end.next;
                }
            }

            return start;
        }


        static void printList(ListNode l)
        {
            while (l != null)
            {
                Console.Write($"{l.val}, ");
                l = l.next;
            }
            Console.WriteLine("");
        }
    }


    class LeetCode_AddTwoNum
    {
        public ListNode AddTwoNumbers(ListNode l1, ListNode l2)
        {
            //定义一个节点用来存储新链表的第一个节点
            ListNode firstNode = new ListNode(0);
            //定义一个循环的节点
            ListNode lastnode = firstNode;
            //进位
            int val = 0;
            while (l1 != null || l2 != null || val != 0)
            {
                int num1, num2;
                if (l1 == null)
                    num1 = 0;
                else
                    num1 = l1.val;

                if (l2 == null)
                    num2 = 0;
                else
                    num2 = l2.val;

                int value = num1 + num2 + val;
                val = value / 10;
                value = value % 10;
                lastnode.next = new ListNode(value);
                lastnode = lastnode.next;

                if (l1 == null)
                    l1 = null;
                else
                    l1 = l1.next;

                if (l2 == null)
                    l2 = null;
                else
                    l2 = l2.next;
            }

            return firstNode.next;
        }


        public ListNode AddTwoNumbers_1(ListNode l1, ListNode l2)
        {
            ListNode head = null, tail = null;
            int carry = 0;
            while (l1 != null || l2 != null)
            {
                int n1 = l1 != null ? l1.val : 0;
                int n2 = l2 != null ? l2.val : 0;
                int sum = n1 + n2 + carry;
                if (head == null)
                {
                    head = tail = new ListNode(sum % 10);
                }
                else
                {
                    tail.next = new ListNode(sum % 10);
                    tail = tail.next;
                }
                carry = sum / 10;
                if (l1 != null)
                {
                    l1 = l1.next;
                }
                if (l2 != null)
                {
                    l2 = l2.next;
                }
            }
            if (carry > 0)
            {
                tail.next = new ListNode(carry);
            }
            return head;
        }
    }


    class ListNode
    {
        public int val;
        public ListNode next;
        public ListNode(int val = 0, ListNode next = null)
        {
            this.val = val;
            this.next = next;
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值