2. 两数相加
2. 两数相加
题目描述:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零
思路:
这题已经简化很多了,但是还是要考虑挺多情况,最重要的就是进位情况,弄一个新的链表用来存放两个链表的值,如果两个链表不等长,就把长的那个直接放在l3后面,最重要的这个时候要考虑连续进位的情况,记得用循环解决
代码:
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
if l1.Next==nil&&l1.Val==0{
return l2
}else if l2.Next==nil&&l2.Val==0{
return l1
}
var flag int
l3 := &ListNode{}
head :=l3
l3 .Val =l1.Val+l2.Val
if l3.Val>=10{
l3.Val %=10
flag=1
}
l1 = l1.Next
l2 = l2.Next
for l1!=nil&&l2 !=nil{
node := &ListNode{}
l3.Next=node
l3 = node
l3. Val +=(l1.Val+l2.Val+flag)
if l3.Val>=10{
l3.Val %= 10
flag =1
}else{
flag = 0
}
l1 = l1.Next
l2 = l2.Next
}
//l2和l1等长
if l2==nil && l1 ==nil {
if flag == 1 {
node := &ListNode{Val: 1}
l3.Next = node
}
//l2长
}else if l1==nil{
l3.Next = l2
if flag==1{
l2.Val++
for l2.Val>=10{
if l2.Next==nil{ //连续进位情况
node := &ListNode{Val: 1}
l2.Val = 0
l2.Next = node
break
}
l2.Val %=10
l2=l2.Next
l2.Val++
}
}
//l1长
}else if l2==nil{
l3.Next = l1
if flag ==1{
l1.Val++
for l1.Val>=10{
if l1.Next == nil{
node := &ListNode{Val: 1}//连续进位情况
l1.Val=0
l1.Next= node
break
}
l1.Val %=10
l1=l1.Next
l1.Val++
}
}
}
return head
}
代码效率:
执行用时:12 ms, 在所有 Go 提交中击败了72.47%的用户
内存消耗:4.6 MB, 在所有 Go 提交中击败了97.34%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!