leetCode题2-两数相加

2020-09-05  本文已影响0人  GoSnail

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

示例:

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

输出:7->0->8

原因:342+465=807

解题思路:

1、分别遍历两个链表p与q,因为逆序的,为我们运算提供了方便,只要让Ai和Bi相加即可

2、将Ai与Bi相加然后取余数,即为新计算的个位数,然后对Ai+Bi做除10操作,得到的数作为进位(程序中我们用flag标记),

3、然后进行p=p.next q=q.next ,程序结束条件为p q均为nil。

4、当p q均为nil时,切记不要直接返回,这里要考虑到如果此时有进位的情况,也就是我们算数学的时候比如5+5的时候,个位数为0,但是十位数为1;因此此时要判断是否flag=1,如果=1,则插入一个节点,然后才生成一个完整的链表。

下面按照这个思路上代码:

type Nums struct {

    Num int

    Next *Nums

}

func NewNums(src []int) *Nums {

        var head, tmp *Nums

       for _, v :=range src {

            if head ==nil {    //第一个节点头节点,也可以哨兵的写法,浪费一个节点空间,用空节点

                head = &Nums{v, nil}

                tmp = head

                continue

          }

        n := &Nums{v, nil}

        tmp.Next = n

        tmp = n

       }

    return head

}

//方便打印,自己写了个println函数

func Println(head *Nums) {

    for {

        if head !=nil {

            fmt.Printf("%d", head.Num)

            head = head.Next

            if head !=nil {

                fmt.Printf("->")

            }

            continue

      }

    fmt.Println()

    break

  }

}

func LeetCode2(p, q *Nums) (*Nums, error) {

    var pv int

      var qv int

      var flag int

       var head, tmp *Nums

       for p !=nil || q !=nil {

            pv =0

             qv =0

              if p !=nil {

                    pv = p.Num

            }

            if q !=nil {

                qv = q.Num

            }

            if head ==nil {

                head = &Nums{(pv + qv + flag) %10, nil}

                tmp = head

            }else {

                t := &Nums{(pv + qv + flag) %10, nil}

                tmp.Next = t

                tmp = tmp.Next

            }

        flag = (pv + qv + flag) /10

      if p !=nil {

            p = p.Next

    }

    if q !=nil {

        q = q.Next

    }

    if p ==nil && q ==nil {

        //todo 判断flag是否为1,如果为1,补一个节点

            if flag ==1 {

                    t := &Nums{flag, nil}

                    tmp.Next = t

            }

            return head, nil

          }

    }

    return nil, errors.New("list error!!!")

}

上一篇 下一篇

猜你喜欢

热点阅读