2、两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
答案
//第一种方式,参考官方解法,代码简洁 func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { //定义一个新的链表,表头叫headNode headNode := &ListNode{ Val:0, Next:nil, } //用一个新的list指针指向headNode,用于接下来的计算 list := headNode //data是用来计算每次相加向前进位的数 data := 0 //i和j分别记录此次循环中l1和l2的对应的值 var i int var j int //循环遍历,直到l1和l2都为nil for l1 != nil || l2 != nil { //计算i和j的值 if l1 ==nil{ i=0 }else{ i = l1.Val } if l2 == nil{ j = 0 }else{ j = l2.Val } //计算sum和data值 sum := i + j + data data = sum / 10 //定义list下一个节点来存储结果,list的头节点是空的,不存值,可以用data来决定最后是否开一个节点 //最后返回的就是头节点的next list.Next = &ListNode{ Val: sum % 10, Next: nil, } list = list.Next if (l1 != nil){ l1 = l1.Next } if l2 != nil { l2 = l2.Next } } //判断最后是否生成额外节点 if data != 0 { list.Next = &ListNode{ Val: data, Next: nil, } } return headNode.Next } //第二种方式,将每一种情况都列出来,并且直接将结果写入l1链表中,不单独建立链表 func addTwoNumbers1(l1 *ListNode,l2 *ListNode)*ListNode{ data := 0 headNode := l1 for l1.Next != nil && l2.Next!= nil { sum := l1.Val + l2.Val + data data = sum / 10 l1.Val = sum % 10 l1 = l1.Next l2 = l2.Next } if l1.Next == nil && l2.Next != nil{ sum := l1.Val + l2.Val + data data = sum / 10 l1.Val = sum % 10 l2 = l2.Next for l2 != nil { sum = data+l2.Val data = sum / 10 l1.Next = &ListNode{ Val: sum %10, Next: nil, } l1 = l1.Next l2 = l2.Next } if data != 0 { l1.Next = &ListNode{ Val: data, Next: nil, } } } else if l1.Next != nil && l2.Next == nil{ sum := l1.Val + l2.Val + data data = sum / 10 l1.Val = sum % 10 for l1.Next != nil { l1 = l1.Next sum = data+l1.Val data = sum / 10 l1.Val = sum % 10 } if data != 0 { l1.Next = &ListNode{ Val: data, Next: nil, } } }else{ sum := l1.Val + l2.Val + data data = sum / 10 l1.Val = sum % 10 if data != 0 { l1.Next = &ListNode{ Val:data, Next:nil, } } } return headNode }