[LeetCode-Golang] 2. 两数相加
题目
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
链接:https://leetcode-cn.com/problems/add-two-numbers
思路
1.设置哑节点(如果不设置哑节点,要计算初始化表头的值);进位carry初始化为0
2.用两个指针遍历两个链表,两个链表按位相加v1 + v2 + carry,如果有进位,则carry为1
3.两个链表长度不同时,如果短链表的指针已经走到末尾,则设置该值为0,否则为该节点的Val
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 }