leetcode day1

此题来自LeetCode,系中等难度的算法题

题目

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

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

示例:

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

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package main

func main() {
//使用1+99测试
l1 := &ListNode{1, nil}
l2 := &ListNode{9, nil}
addNode(l2, 9)
ll := addTwoNumbers(l1, l2)
travel(ll)
}

//单链表
type ListNode struct {
Val int
Next *ListNode
}

//主要函数,相加两个链表并返回一个新的链表作为结果
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
res := &ListNode{}
resTmp := res
var res1, res2 int

for ; l1 != nil || l2 != nil; l1, l2 = l1.Next, l2.Next {
tmpNode := &ListNode{}
if l1 == nil {
l1 = &ListNode{}
} else if l2 == nil {
l2 = &ListNode{}
}
res1, res2 = add(l1.Val, l2.Val, res2)
tmpNode.Val = res1
resTmp.Next = tmpNode
resTmp = resTmp.Next
}
if res2 != 0 {
resTmp.Next = &ListNode{res2, nil}
}
return res.Next
}

//相加3个数,返回其结果的个位数和十位数
func add(a, b, c int) (res1, res2 int) {
res := a + b + c
if res >= 10 {
res1 = res % 10
res2 = res / 10
} else {
res1 = res
}
return
}

//添加一个节点,仅方便测试用
func addNode(l1 *ListNode, a int) (l2 *ListNode) {
l2 = &ListNode{a, nil}
l1.Next = l2
return
}

//遍历整个链表
func travel(l *ListNode) {
for l != nil {
println(l.Val)
l = l.Next
}
}

小结

这题我写了很久-.-,明明觉得并不难的,却把时间耗在了各种逻辑判断中了…我的编程能力依旧有待提高

0%