题目描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
解题代码:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
var tmpListNode ListNode
var addNumSec, addNumFir, temSum, count int
var goComeFlag bool = false
lenL1 := getListLen(l1)
lenL2 := getListLen(l2)
if lenL1 == 1 || lenL2 == 1 {
if lenL1 == 1 {
if l1.Val == 0 {
return l2
}
}
if lenL2 == 1 {
if l2.Val == 0 {
return l1
}
}
}
if lenL1 < lenL2 {
for i := 0; i < lenL2-lenL1; i++ {
InsertNode(l1, 0)
}
}
if lenL2 < lenL1 {
for i := 0; i < lenL1-lenL2; i++ {
InsertNode(l2, 0)
}
}
for l1.Next != nil {
count++
if goComeFlag {
temSum = l1.Val + l2.Val + addNumSec
} else {
temSum = l1.Val + l2.Val
}
addNumFir = temSum
if temSum >= 10 {
goComeFlag = true
addNumFir = temSum / 1 % 10
addNumSec = temSum / 10 % 10
}else {
goComeFlag = false
}
if count == 1 {
tmpListNode = ListNode{
Val: addNumFir,
Next: nil,
}
l1 = l1.Next
l2 = l2.Next
continue
}
if temSum >= 10 {
InsertNode(&tmpListNode, addNumFir)
} else{
InsertNode(&tmpListNode, temSum)
}
l1 = l1.Next
l2 = l2.Next
}
if goComeFlag {
temSum = l1.Val + l2.Val + addNumSec
} else {
temSum = l1.Val + l2.Val
}
if temSum >= 10 {
addNumFir = temSum / 1 % 10
addNumSec = temSum / 10 % 10
}
if lenL1 == 1 && lenL2 == 1 && temSum < 10 {
tmpListNode.Val = temSum
} else {
if lenL1 == 1 && lenL2 == 1 && temSum >= 10 {
tmpListNode.Val = addNumFir
InsertNode(&tmpListNode, addNumSec)
} else if temSum >= 10 {
InsertNode(&tmpListNode, addNumFir)
InsertNode(&tmpListNode, addNumSec)
} else {
InsertNode(&tmpListNode, temSum)
}
}
return &tmpListNode
}
func InsertNode(l1 *ListNode, data int) {
for l1.Next != nil {
l1 = l1.Next
}
tmpNode := ListNode{
Val: data,
Next: nil,
}
l1.Next = &tmpNode
}
func PrintList(l1 *ListNode) {
for l1.Next != nil {
fmt.Printf("list val is: %v\n", l1.Val)
l1 = l1.Next
}
fmt.Printf("list val is: %v\n", l1.Val)
}
func getListLen(l1 *ListNode) int {
var count int
for l1.Next != nil {
count++
l1 = l1.Next
}
return count + 1
}
func reverseList(l1 *ListNode) *ListNode {
num := []int{}
listLen := getListLen(l1)
if listLen == 1 {
return l1
}
for l1.Next != nil {
num = append(num, l1.Val)
l1 = l1.Next
}
num = append(num, l1.Val)
tmpListNode := ListNode{Val: num[len(num)-1]}
for i := len(num) - 2; i >= 0; i-- {
InsertNode(&tmpListNode, num[i])
}
return &tmpListNode
}