美文网首页
两链表树相加

两链表树相加

作者: ES_KYW | 来源:发表于2020-09-16 16:48 被阅读0次

    给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
    如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
    您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
    示例:
    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出:7 -> 0 -> 8
    原因:342 + 465 = 807

    缺陷:int会溢出。其他方案:先比较长度,然后在较长的链表的for循环环境下,每一位的值相加,溢出的带入到下一个位的计算,将每一个计算值保存在切片中,最后for循环切片,重新构造链表

    func addList(a *ListNode,b *ListNode) *ListNode {
        
        root_note := &ListNode{}
        a_arr := []int{}
        b_arr := []int{}
    
        temp_a := &ListNode{}
        temp_a.Next = a
    
        temp_b := &ListNode{}
        temp_b.Next = b
    
        for temp_a.Next != nil  {
    
            temp_a = temp_a.Next
            a_arr = append(a_arr,temp_a.Val)
    
        }
    
        for temp_b.Next != nil  {
    
            temp_b = temp_b.Next
            b_arr = append(b_arr,temp_b.Val)
    
        }
    
        // 将数组反转成数字
        var str_a = ""
        var str_b = ""
    
        for i := len(a_arr)-1;i>=0;i--{
            str_a = str_a + strconv.Itoa(a_arr[i])
        }
        for i := len(b_arr)-1;i>=0;i--{
            str_b = str_b + strconv.Itoa(b_arr[i])
        }
    
        int_a,_ := strconv.Atoi(str_a)
        int_b,_ := strconv.Atoi(str_b)
    
        var sum =int_a + int_b
    
        int_str := strconv.Itoa(sum)
    
        byte_arr :=[]byte(int_str)
        temp_note := &ListNode{}
    
        for i:=len(byte_arr)-1;i>= 0;i-- {
    
            if i < len(byte_arr)-1{
                note := &ListNode{}
                val,_ := strconv.Atoi(string(byte_arr[i]))
                note.Val = val
                temp_note.Next = note
                temp_note = note
            }else {
    
                val,_ := strconv.Atoi(string(byte_arr[i]))
                temp_note.Val = val
                root_note = temp_note
            }
        }
        fmt.Println(sum)
        fmt.Printf("%v",a_arr)
        fmt.Printf("%v",b_arr)
        fmt.Printf("%v",root_note.Val)
        fmt.Printf("%v",root_note.Next.Val)
        fmt.Printf("%v",root_note.Next.Next.Val)
        fmt.Printf("%v",root_note.Next.Next.Next.Val)
        return root_note
    }
    测试
    func main() {
    
        a3 := &ListNode{}
        a3.Val = 4
    
        a2 := &ListNode{}
        a2.Val = 3
        a2.Next = a3
    
        a1 := &ListNode{}
        a1.Val = 2
        a1.Next = a2
        //
        a := &ListNode{}
        a.Val = 1
        a.Next = a1
    
        b3 := &ListNode{}
        b3.Val = 4
    
        b2 := &ListNode{}
        b2.Val = 2
        b2.Next = b3
    
        b1 := &ListNode{}
        b1.Val = 2
        b1.Next = b2
    
        b := &ListNode{}
        b.Val = 1
        b.Next = b1
    
        addList(a,b)
    }
    8542
    [1 2 3 4][1 2 2 4]2458
    
    

    相关文章

      网友评论

          本文标题:两链表树相加

          本文链接:https://www.haomeiwen.com/subject/cqlhyktx.html