[LeetCode-Golang] 2. 两数相加

题目

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

思路

1.设置哑节点(如果不设置哑节点,要计算初始化表头的值);进位carry初始化为0
2.用两个指针遍历两个链表,两个链表按位相加v1 + v2 + carry,如果有进位,则carry为1
3.两个链表长度不同时,如果短链表的指针已经走到末尾,则设置该值为0,否则为该节点的Val
4.当两个指针都走到链表末尾,退出循环
5.不要忘了判断最后的进位!如果carry=1,需要在追加Val=1的节点
6.最后返回哑节点.Next

复杂度分析

时间复杂度 O(m+n)

空间复杂度 O(m+n)

m 和 n 分别表示两个链表的长度

代码

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    // 记录进位
    carry := 0
    var dummyHead ListNode
    // 指向三个链表的指针
    p1, p2, p3 := l1, l2, &dummyHead
    for p1 != nil || p2 != nil {
        v1, v2 := 0, 0
        if p1 != nil {
            v1 = p1.Val
            p1 = p1.Next
        }
        if p2 != nil {
            v2 = p2.Val
            p2 = p2.Next
        }
        sum := v1 + v2 + carry
        carry = sum / 10
        p3.Next = &ListNode{Val : sum % 10}
        p3 = p3.Next
    }
    // 注意检查最后的进位!
    if carry == 1 {
        p3.Next = &ListNode{Val : 1}
    }
    return dummyHead.Next
}

  

posted @ 2020-03-14 23:34  世界边境  阅读(119)  评论(0编辑  收藏  举报