Skip to content
On this page

想法

初步觉得需要操作一下数组 转数字 在加一下转回去

题目都不太懂

因为学前端没解除过链表 数据结构光学二叉树了(虽然我还没好好听)但是幸运的是正好买了本算法小册 懂了链表 回头再来刷这道题 看了一下解析 明白了

go
type ListNode struct {
	Val  int
	Next *ListNode
}

func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
	return nil
}

func main() {  //这样就叫链表
	l1 := ListNode{2, &ListNode{4, &ListNode{4, &ListNode{3, nil}}}}
	l2 := ListNode{5, &ListNode{6, &ListNode{4, &ListNode{3, nil}}}}
	addTwoNumbers(&l1, &l2)
}

初步自己解题

go
type ListNode struct {
	Val  int
	Next *ListNode
}

func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
	var cur1 *ListNode = l1
	var cur2 *ListNode = l2
	var slice1 []string
	var slice2 []string

	// 链表转数组
	for cur1 != nil {
		slice1 = append(slice1, strconv.Itoa(cur1.Val))
		cur1 = cur1.Next
	}

	for cur2 != nil {
		slice2 = append(slice2, strconv.Itoa(cur2.Val))
		cur2 = cur2.Next
	}

	// 反转
	for i := 0; i < len(slice1)/2; i++ {
		temp := slice1[i]
		slice1[i] = slice1[len(slice1)-i-1]
		slice1[len(slice1)-i-1] = temp
	}
	for i := 0; i < len(slice2)/2; i++ {
		temp := slice2[i]
		slice2[i] = slice2[len(slice2)-i-1]
		slice2[len(slice2)-i-1] = temp
	}

	// 数组转字符串
	str1 := strings.Join(slice1, "")
	str2 := strings.Join(slice2, "")

	// 相加计算
	num1, _ := strconv.Atoi(str1)
	num2, _ := strconv.Atoi(str2)
	num := num1 + num2

	// 切割
	numArr := strings.Split(strconv.Itoa(num), "")

	// 反转数组
	var reversalArr []string
	for i := 0; i < len(numArr); i++ {
		reversalArr = append(reversalArr, numArr[len(numArr)-i-1])
	}

	// 反转创建链表
	var returnListNode = new(ListNode)
	var cur = returnListNode
	for i := 0; i < len(reversalArr); i++ {
		// n, _ := strconv.Atoi(numArr[len(numArr)-i])
		n, _ := strconv.Atoi(reversalArr[i])

		// returnListNode.Val = n  //这样创建就会报错 自己写的不对 panic: runtime error: invalid memory address or nil pointer dereference
		// returnListNode = returnListNode.Next

		returnListNode.Next = &ListNode{Val: n}
		returnListNode = returnListNode.Next
	}

	return cur.Next

}

自己用的很笨的方法 不过是我第一时间想出来的 还是没有链表思想

失败的原因可能是数字超过 go int 类型的最大值了 (我换了 uint64 但是 func strconv.Atoi(s string) (int, error)这个函数返回值是 int 类型 所以不了了之了)

别人的题解

思路:

不断遍历两个链表,然后讲两个节点的数值相加。

注意:相加的总和(下面代码中的 totalValue)可能会产生超出 10 的范围,超出 10 的范围需要将超出的数值(下面代码中的 preValue)保留到下一个节点使用。

时间复杂度:O(max(m,n)),其中 m 和 n 分别为两个链表的长度。我们要遍历两个链表的全部位置,而处理每个位置只需要 O(1)的时间。

空间复杂度:O(1)。注意返回值不计入空间复杂度。

go
type ListNode struct {
	Val  int
	Next *ListNode
}

func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
	resultNode := new(ListNode)
	tempNode := resultNode
	preValue := 0

	// 两个链表不为空, 一直遍历
	for l1 != nil || l2 != nil {
		val1, val2, currentValue := 0, 0, 0

		if l1 != nil {
			val1 = l1.Val
			l1 = l1.Next
		}

		if l2 != nil {
			val2 = l2.Val
			l2 = l2.Next
		}

		// 取得当前总和
		totalValue := val1 + val2 + preValue
		// 当前"个位"与"进位"值
		currentValue, preValue = totalValue%10, totalValue/10

		tempNode.Next = &ListNode{Val: currentValue}
		tempNode = tempNode.Next
	}

	// 产生进位的特殊情况判断
	if preValue > 0 {
		tempNode.Next = &ListNode{Val: preValue}
	}

	return resultNode.Next
}