刷题---链表篇---2. 两数相加(go,python)

99 篇文章 0 订阅
7 篇文章 0 订阅

2. 两数相加

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

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

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

示例:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

————————————————————————————————————————————————————————

头插法,链表遍历综合题。

用k表示两个节点的相加之和,用flag表示是否进位。

情况有三种:

(1)l1,l2都没有遍历完时,l1,l2同时向后遍历,两个节点的值相加为k,flag表示是否有进位,有则加到下一个节点和之中。

(2)l1,l2之中有一条链表已经遍历完,则将还未遍历完的一条与进位标志数flag相加,进行生成节点操作。

(3)l1,l2,都遍历完,只用判断flag是否还有进位,若有则生成最后一个值为1的尾节点,没有则直接结束。

go实现

func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    head := &ListNode{0,nil}
    p := head
    
    k := 0
    flag := 0

    for l1 != nil && l2 != nil {

        k = l1.Val + l2.Val + flag
        if k >= 10 {
            k = k%10
            flag = 1
        } else {
            flag = 0
        }
        
        t := &ListNode{k,nil}
        p.Next = t
        p = p.Next

        l1 = l1.Next
        l2 = l2.Next
    }

    for l1 != nil {
        k = l1.Val + flag
        if k >= 10 {
            k = k%10
            flag = 1
        } else {
            flag = 0
        }
        
        t := &ListNode{k,nil}
        p.Next = t
        p = p.Next

        l1 = l1.Next
    }

    for l2 != nil {
         k = l2.Val + flag
        if k >= 10 {
            k = k%10
            flag = 1
        } else {
            flag = 0
        }
        
        t := &ListNode{k,nil}
        p.Next = t
        p = p.Next

        l2 = l2.Next
    }

    if flag > 0 {
        t := &ListNode{flag,nil}
        p.Next = t
        p = p.Next
    }

    return head.Next
}

python实现:

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        #初始化变量:
        resHead = ListNode(0,None)
        flag = 0
        p = resHead

        #l1 和 l2 同时往后遍历相加
        while l1 != None and l2 != None :
            t = ListNode(0,None)
            num = l1.val + l2.val + flag

            if num > 10 :
                flag = 1
                num = num%10
            elif num == 10 :
                num = 0
                flag = 1
            else :
                flag = 0

            t.val = num
            p.next = t
            l1 = l1.next
            l2 = l2.next
            p = p.next
        
        #当l1没有遍历完时
        while l1 != None :
            t = ListNode(0,None)
            num = l1.val  + flag

            if num > 10 :
                flag = 1
                num = num%10
            elif num == 10 :
                num = 0
                flag = 1
            else :
                flag = 0

            t.val = num
            p.next = t
            l1 = l1.next
            p = p.next

        #当l2没有遍历完时
        while l2 != None :
            t = ListNode(0,None)
            num = l2.val  + flag

            if num > 10 :
                flag = 1
                num = num%10
            elif num == 10 :
                num = 0
                flag = 1
            else :
                flag = 0

            t.val = num
            p.next = t
            l2 = l2.next
            p = p.next
        
        #最后还有一个进位
        if flag > 0 :
            t = ListNode(1,None)
            p.next = t

        return resHead.next

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值