LeetCode-0002 两数相加

题目

给出两个【非空】的链表用来表示两个非负的整数。其中,它们各自的位数是按照【逆序】的方式存储的,并且它们的每个节点只能存储【一位】数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

说明

链表的节点按如下定义

type ListNode struct {
	Val  int
	Next *ListNode
}

解答

注意处理进位。

func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
	var (
		t1 *ListNode = l1
		t2 *ListNode = l2
		p  *ListNode
	)

	// 为编写代码方便,设立一个哑节点
	ret := &ListNode{
		Val:  0,
		Next: nil,
	}
	p = ret

	var (
		x     int
		y     int
		carry int = 0
		s     int = 0
	)

	for t1 != nil || t2 != nil {
		if t1 != nil {
			x = t1.Val
		} else {
			x = 0
		}
		if t2 != nil {
			y = t2.Val
		} else {
			y = 0
		}

		s = x + y + carry
		carry = s / 10

		p.Next = &ListNode{
			Val:  s % 10,
			Next: nil,
		}
		p = p.Next

		if t1 != nil {
			t1 = t1.Next
		}
		if t2 != nil {
			t2 = t2.Next
		}
	}

	if carry != 0 {
		p.Next = &ListNode{
			Val:  carry,
			Next: nil,
		}
	}

	// 把哑节点去掉再返回
	ret = ret.Next
	return ret
}

用来创建测试用数据的函数

func createTestData(a []int, b []int) (*ListNode, *ListNode) {
	const textErr = "bad param"
	if a == nil || b == nil {
		panic(textErr)
	}
	m, n := len(a), len(b)
	if m == 0 || n == 0 {
		panic(textErr)
	}
	if (a[0] == 0 && m != 1) || (b[0] == 0 && n != 1) {
		panic(textErr)
	}
	for i := 0; i < m; i++ {
		if a[i] < 0 || a[i] > 9 {
			panic(textErr)
		}
	}
	for i := 0; i < n; i++ {
		if b[i] < 0 || b[i] > 9 {
			panic(textErr)
		}
	}
	var l1 *ListNode
	var l2 *ListNode
	var p *ListNode
	var q *ListNode
	for i := 0; i < m; i++ {
		p = &ListNode{
			Val:  a[i],
			Next: nil,
		}
		if i == 0 {
			q = p
			l1 = p
		} else {
			q.Next = p
			q = p
		}
	}
	for i := 0; i < n; i++ {
		p = &ListNode{
			Val:  b[i],
			Next: nil,
		}
		if i == 0 {
			q = p
			l2 = p
		} else {
			q.Next = p
			q = p
		}
	}
	return l1, l2
}
posted @ 2019-12-31 15:58  风华神使  阅读(107)  评论(0)    收藏  举报