2018-08-26

作者: 李红斌_三月 | 来源:发表于2018-08-26 17:50 被阅读68次

    题目如下:
    给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
    你可以假设除了数字 0 之外,这两个数字都不会以零开头。
    示例:
    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出:7 -> 0 -> 8
    原因:342 + 465 = 807

    直接能够想到的就是把链表中的数组组成一个整数然后相加,但是对于较长的链表而言,整数范围是不够滴(leetcode上最后的例子数字已经超过了64位所能代表的最大整数,浮点数没有具体计算过),而且时间复杂度,应该是O(2(m+n)),取数一次操作,赋值又一次操作.所以这里考虑将每一个节点的值相加,然后赋值给新的链表,时间复杂度为O(max(m,n)),并且不会出现数值过大无法计算的情况.

    代码如下

    func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    
        p1 := l1
        p2 := l2
        p1Next := p1
        p2Next := p2
        p3 := &ListNode{}
        p3Next := p3
        CF := 0
    
        for {
    
            if p1Next != nil || p2Next != nil || CF != 0{
    
                v1 :=0
                if(p1Next != nil){
                     v1= p1Next.Val
                }
                v2 := 0
                if(p2Next != nil){
                    v2= p2Next.Val
                }
    
                val := v1 + v2 + CF
                if val >= 10 {
                    p3Next.Val = val - 10
                    CF = 1
                } else {
                    p3Next.Val = val
                    CF = 0
                }
    
                if p1Next != nil {
                    p1Next = p1Next.Next
                }
                if p2Next != nil {
                    p2Next = p2Next.Next
                }
    
                if(p1Next != nil || p2Next!= nil || CF!=0){
                    p3Next.Next = &ListNode{}
                    p3Next = p3Next.Next
                }
            }else{
                break
            }
        }
        return p3
    }
    

    相关文章

      网友评论

      • 李云_三月:思维不错,但是这题目很不能见名知意的!

      本文标题:2018-08-26

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