2.两数相加

题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/add-two-numbers

  

解题思路(迭代):
        
把两个链表相加,然后返回一个相加好的链表,我们可以将一个链表进行修改,然后返回那个修改过的链表

源代码:

//迭代的方法
        public ListNode AddTwoNumbers1(ListNode l1, ListNode l2)
        {
            //定义两数相加的和,以及是否进位1
            int total = 0;
            int Next1 = 0;

            //定义两个指针,result指针负责返回的时候的指针,不需要移动。cur指针负责在链表移动的指针
            ListNode result = new ListNode();
            ListNode cur = new ListNode();

            //让两个指针都指向l1,去修改l1的数据,到时候返回l1的链表就可以了
            result.next = l1;
            cur.next = l1;       

            //如果l1,l2链表的下一个指向的不为空
            while (l1 != null && l2 != null)
            {
                total = l1.val + l2.val + Next1;
                //由于前面是cur.next = l1所以这里只能该cur.next的数据
                cur.next.val = total % 10;
                Next1 = total / 10;
                l1 = l1.next;
                l2 = l2.next;
                cur = cur.next;
            }

            //如果l2为空l1不为空,那么和就只用计算l1和Next1的和
             while(l1 != null)
            {
                total = l1.val + Next1;
                cur.next.val = total % 10;
                Next1 = total / 10;
                l1 = l1.next;
                cur = cur.next;
            }

            //如果l1为空l2不为空,那么和就只用计算l2和Next1的和
            while (l2 != null)
            {
                total = l2.val + Next1;
                cur.next = new ListNode(total % 10);
                Next1 = total / 10;
                l2 = l2.next;
                cur = cur.next;
            }

            //如果l1为空,l2为空,那么就只需要进1就可以了
            if(Next1 != 0)
            {
                cur.next = new ListNode(1);              
            }
           
            //返回链表
            return result.next;
        }

解题思路(递归)

        利用递归的特性一环扣一环 ,在辅助函数传参的时候,除了传入l1,l2,以及新链表,还要将是否进1传入

 

源代码

 

//递归的方法
        public ListNode AddTwoNumbers2(ListNode l1, ListNode l2)
        {
            //定义一个新的链表
            ListNode dummyNode = new ListNode(0);
            //辅助的递归函数
            helper(dummyNode, l1, l2, 0);
            //返回的链表
            return dummyNode.next;
        }

        private void helper(ListNode perNode,ListNode l1,ListNode l2,int next1)
        {
            //如果l1,l2的下一个指向为空了,并且next1没有进位了就可以进行返回了
            if (l1 == null && l2 == null && next1 == 0)
                return;

            //定义一个和,然后先让和加上进位
            int total = next1;

            //如果l1的下一个链表不为空就相加,并且l1的指针向后移
            if(l1 != null)
            {
                total += l1.val;
                l1 = l1.next;
            }

            //如果l2的下一个链表不为空就相加,并且l2的指针向后移
            if (l2 != null)
            {
                total += l2.val;
                l2 = l2.next;
            }

            //perNode为传入的新链表让下一个链表指向数据修改的链表
            ListNode newNode = new ListNode(total % 10);
            perNode.next = newNode;

            //进位
            next1 = total / 10;

            //再次进行函数的调用
            helper(newNode, l1, l2, next1);
        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值