两数相加

两数相加

这是一道来自leetcode的算法题目。

题目描述

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

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

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

示例:

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

算法实现

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        # pointer1=l1
        # pointer2=l2
        res=ListNode(-1)
        pointer3=res
        temp=0
        # test=pointer1
        while l1 or l2:
            number1=0 if l1==None else l1.val
            number2=0 if l2==None else l2.val
            s=temp+number1+number2
            pointer3.next=ListNode((s)%10)
            pointer3=pointer3.next
            temp=(s)//10
            # if pointer1 and  pointer1.next==None:
            #     test=pointer1
            if l1!=None:
                l1=l1.next
            if l2!=None:
                l2=l2.next
        if temp!=0:
            pointer3.next=ListNode(1)
        return res.next
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public int val;
 *     public ListNode next;
 *     public ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode AddTwoNumbers(ListNode l1, ListNode l2) {
        
    

            //定义返回值
            var result = new ListNode(-1);
            //定义循环用的对象,将形参制定到temp
            var temp = result;
            //前一轮数字和的十位数
            int Other = 0;
         while(l1!=null||l2!=null)
         {
             int num1=l1==null?0:l1.val;
             int num2=l2==null?0:l2.val;
             int sum=num1+num2+Other;
             temp.next=new ListNode(sum%10);
             temp=temp.next;
             Other=sum/10;
             if(l1!=null)l1=l1.next;
             if(l2!=null)l2=l2.next;
         }
        if(Other>0)
            temp.next=new ListNode(Other);
   
        return result.next;
}
}

实验结果

在这里插入图片描述
python算法实现

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        # pointer1=l1
        # pointer2=l2
        res=ListNode(-1)
        pointer3=res
        temp=0
        # test=pointer1
        while l1 or l2:
            number1=0 if l1==None else l1.val
            number2=0 if l2==None else l2.val
            s=temp+number1+number2
            pointer3.next=ListNode((s)%10)
            pointer3=pointer3.next
            temp=(s)//10
            # if pointer1 and  pointer1.next==None:
            #     test=pointer1
            if l1!=None:
                l1=l1.next
            if l2!=None:
                l2=l2.next
        if temp!=0:
            pointer3.next=ListNode(1)
        return res.next
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        a=l1
        b=l2
        other=0
        result=ListNode(0)
        temp=result
        while a or b:
            val=(a.val if a else 0)+( b.val if b else 0)+other
            other=int (val/10)
            temp.next=ListNode(int(val%10))
            a=a.next if a else None
            b=b.next if b else None
            temp=temp.next
        if(other>0):
            temp.next=ListNode(1)
        return result.next

就是建立一个新的链表然后从个位数一个个加进去就好了。
需要注意的一点时要考虑两个数字位数不同的情侣,即一个链表还没遍历完,一个已经遍历完了。
可以多加一个判断,如果已经遍历完了读取其val时加个判断,直接让这个数为零。
在这里插入图片描述

递归

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        def add(pointer1,pointer2,carry):
            if pointer1==None and pointer2==None:
                return ListNode(1) if carry!=0 else None
            pointer1=pointer1 if pointer1 else ListNode(0)
            pointer2=pointer2 if pointer2 else ListNode(0)
            s=pointer1.val+pointer2.val+carry
            carry=s//10
            pointer1.val=s%10
            pointer1.next=add(pointer1.next,pointer2.next,carry)
            return pointer1
        return add(l1,l2,0)


**

疑问

**

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        a=l1
        b=l2
        other=0
        while a or b:
            val=a.val+b.val+other
            other=int (val/10)
            a.val=int (val%10)
            a=a.next if a else None 
            b=b.next if b else None
        if(other>0 ):
            a=ListNode(1)
        return l1

在这里插入图片描述

解答

这个地方a是一个单纯的指针,只是 a=ListNode(1)并不能够把这个新的节点连接到了l1上去,只是让a 指向了这个ListNode(1).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值