LeetCode(golang):2、两数相加

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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值