Skip to content

LeetCode 两数相加

Posted on:October 31, 2023 at 11:22 PM

题目

LeetCode题目链接:两数相加 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

输出:7 -> 0 -> 8

原因:342 + 465 = 807

思路 1

两个链表不等长,那么在任一链表Next为nil时立刻跳出循环,再把长的链表加上去,最后把进位加上去,通俗,但是逻辑显得冗长拖沓。

func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
  ret := &ListNode{}
  curpos := ret //循环指针

  overflow := 0         //进位
  sum := 0              //每次相加之和
  var tailpos *ListNode //未结束的链表指针

  for {
    sum = l1.Val + l2.Val + overflow
    overflow = 0
    if sum > 9 {
    overflow = 1
    sum = sum % 10
  }

  curpos.Val = sum

  l1 = l1.Next
  l2 = l2.Next

  //任一链表结束立刻跳出循环
  if l1 == nil {
    tailpos = l2
    break
  }
  if l2 == nil {
    tailpos = l1
    break
  }
  curpos.Next = &ListNode{}

  curpos = curpos.Next
  }

  if tailpos != nil {
    curpos.Next = &ListNode{}
    curpos = curpos.Next
    for {
      sum = tailpos.Val + overflow

      overflow = 0
      if sum > 9 {
        overflow = 1
        sum = sum % 10
      }

      curpos.Val = sum
      tailpos = tailpos.Next

      if tailpos == nil {
        break
      }
      curpos.Next = &ListNode{}
      curpos = curpos.Next
    }
  }
  if overflow != 0 {
    curpos.Next = &ListNode{Val: overflow, Next: nil}
  }

  return ret
}

思路 2

在之前的基础上稍微改进下,当遇到有结束的链表时,新建0值节点补齐,直到两个链表NEXT节点均为nil时再跳出循环,最后再补上进位。

func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
  ret := &ListNode{}
  curpos := ret

  overflow := 0
  sum := 0

  for {
    sum = l1.Val + l2.Val + overflow
    overflow = 0
    if sum > 9 {
      overflow = 1
      sum = sum % 10
    }

    curpos.Val = sum

    l1 = l1.Next
    l2 = l2.Next

    if l1 == nil && l2 == nil {
      if overflow != 0 {
        curpos.Next = &ListNode{Val: overflow, Next: nil}
      }
      break
    }

    if l1 == nil {
      l1 = &ListNode{Val: 0, Next: nil}
    }

    if l2 == nil {
      l2 = &ListNode{Val: 0, Next: nil}
    }
    curpos.Next = &ListNode{}

    curpos = curpos.Next
  }

  return ret
}