Browse Source

添加两数之和

tangs 5 years ago
parent
commit
6ec695ff05
1 changed files with 43 additions and 39 deletions
  1. 43 39
      AddTwoNumbers/main.go

+ 43 - 39
AddTwoNumbers/main.go

@@ -2,7 +2,6 @@ package main
 
 import (
 	"fmt"
-	"strconv"
 )
 
 func main() {
@@ -15,7 +14,6 @@ func main() {
 	var l1 = &ListNode{
 		9, nil,
 	}
-	fmt.Println(9 + 9999999991)
 	var l2 *ListNode
 	var l2Cuosor *ListNode
 	for i := 0; i < 10; i++ {
@@ -24,7 +22,6 @@ func main() {
 			l2Cuosor = l2
 			continue
 		}
-
 		var temp = &ListNode{9, nil}
 		l2Cuosor.Next = temp
 		l2Cuosor = l2Cuosor.Next
@@ -32,11 +29,6 @@ func main() {
 
 	//	[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]
 	//[5,6,4]
-
-	var i int64 = 1000000000000000000000000000001
-	fmt.Println(i)
-	return
-
 	var result = addTwoNumbers(l1, l2)
 	listPrint(result)
 }
@@ -65,39 +57,51 @@ func listPrint(list *ListNode) {
 }
 
 func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
-	var l1Str, l2Str string
-	var l1Int, l2Int int64
-	var l1Temp, l2Temp = l1, l2
-	for l1Temp != nil {
-		l1Str = strconv.FormatInt(int64(l1Temp.Val), 10) + l1Str
-		l1Temp = l1Temp.Next
-	}
-	for l2Temp != nil {
-		l2Str = strconv.FormatInt(int64(l2Temp.Val), 10) + l2Str
-		l2Temp = l2Temp.Next
+	var l1Tmp, l2Tmp = l1, l2
+	var result, resultTemp, lastNode *ListNode
+	var carry int = 0
+	for l1Tmp != nil && l2Tmp != nil {
+		var value = l1Tmp.Val + l2Tmp.Val + carry
+		tmp := &ListNode{
+			Val:  value % 10,
+			Next: nil,
+		}
+		carry = value / 10
+		if resultTemp == nil {
+			resultTemp = tmp
+			result = resultTemp
+		} else {
+			resultTemp.Next = tmp
+			resultTemp = resultTemp.Next
+		}
+		lastNode = l1Tmp.Next
+		if l1Tmp.Next == nil {
+			lastNode = l2Tmp.Next
+		}
+		l1Tmp = l1Tmp.Next
+		l2Tmp = l2Tmp.Next
 	}
 
-	l1Int, _ = strconv.ParseInt(l1Str, 10, 64)
-	l2Int, _ = strconv.ParseInt(l2Str, 10, 64)
-
-	var num = strconv.FormatInt(l1Int+l2Int, 10)
-	fmt.Println("---------------", num, l1Str, l2Str)
-	var head = &ListNode{}
-	var cursor *ListNode
-	for i := len(num) - 1; i >= 0; i-- {
-		var val, _ = strconv.ParseInt(num[i:i+1], 10, 32)
-		var temp = &ListNode{}
-		temp.Val = int(val)
-		temp.Next = nil
-
-		if i == len(num)-1 {
-			head = temp
-			cursor = head
-			continue
+	for lastNode != nil {
+		var value = lastNode.Val + carry
+		var tmp = &ListNode{
+			Val:  value % 10,
+			Next: nil,
 		}
-
-		cursor.Next = temp
-		cursor = cursor.Next
+		carry = value / 10
+		if resultTemp == nil {
+			resultTemp = tmp
+			result = resultTemp
+		} else {
+			resultTemp.Next = tmp
+			resultTemp = resultTemp.Next
+		}
+		lastNode = lastNode.Next
+	}
+	if carry != 0 {
+		tmp := &ListNode{Val: carry, Next: nil}
+		resultTemp.Next = tmp
+		resultTemp = resultTemp.Next
 	}
-	return head
+	return result
 }