给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
————————————————————————————————————————————————————————
头插法,链表遍历综合题。
用k表示两个节点的相加之和,用flag表示是否进位。
情况有三种:
(1)l1,l2都没有遍历完时,l1,l2同时向后遍历,两个节点的值相加为k,flag表示是否有进位,有则加到下一个节点和之中。
(2)l1,l2之中有一条链表已经遍历完,则将还未遍历完的一条与进位标志数flag相加,进行生成节点操作。
(3)l1,l2,都遍历完,只用判断flag是否还有进位,若有则生成最后一个值为1的尾节点,没有则直接结束。
go实现
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
head := &ListNode{0,nil}
p := head
k := 0
flag := 0
for l1 != nil && l2 != nil {
k = l1.Val + l2.Val + flag
if k >= 10 {
k = k%10
flag = 1
} else {
flag = 0
}
t := &ListNode{k,nil}
p.Next = t
p = p.Next
l1 = l1.Next
l2 = l2.Next
}
for l1 != nil {
k = l1.Val + flag
if k >= 10 {
k = k%10
flag = 1
} else {
flag = 0
}
t := &ListNode{k,nil}
p.Next = t
p = p.Next
l1 = l1.Next
}
for l2 != nil {
k = l2.Val + flag
if k >= 10 {
k = k%10
flag = 1
} else {
flag = 0
}
t := &ListNode{k,nil}
p.Next = t
p = p.Next
l2 = l2.Next
}
if flag > 0 {
t := &ListNode{flag,nil}
p.Next = t
p = p.Next
}
return head.Next
}
python实现:
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
#初始化变量:
resHead = ListNode(0,None)
flag = 0
p = resHead
#l1 和 l2 同时往后遍历相加
while l1 != None and l2 != None :
t = ListNode(0,None)
num = l1.val + l2.val + flag
if num > 10 :
flag = 1
num = num%10
elif num == 10 :
num = 0
flag = 1
else :
flag = 0
t.val = num
p.next = t
l1 = l1.next
l2 = l2.next
p = p.next
#当l1没有遍历完时
while l1 != None :
t = ListNode(0,None)
num = l1.val + flag
if num > 10 :
flag = 1
num = num%10
elif num == 10 :
num = 0
flag = 1
else :
flag = 0
t.val = num
p.next = t
l1 = l1.next
p = p.next
#当l2没有遍历完时
while l2 != None :
t = ListNode(0,None)
num = l2.val + flag
if num > 10 :
flag = 1
num = num%10
elif num == 10 :
num = 0
flag = 1
else :
flag = 0
t.val = num
p.next = t
l2 = l2.next
p = p.next
#最后还有一个进位
if flag > 0 :
t = ListNode(1,None)
p.next = t
return resHead.next