题解 | #链表相加(二)#
链表相加(二)
http://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b
思路:从前面开始加减涉及到位数不同、循环不好设计的问题。这里分别使用切片保存两个链表的值,再逆序排列,这样可以使得本应相加的位数相同。若两个链表的元素个数不同,这里考虑到长链表相加后位数可能会加1,分别将两个切片后添加0,直至添加到长链表元素个数+1。至于两数相加的问题不多介绍,只用一个count表示和超过10的时候的进位操作。
func addInList(head1 *ListNode, head2 *ListNode) *ListNode {
var res, res1, res2 []int
//分别用两个切片保存两个链表的值
for head1 != nil {
res1 = append(res1, head1.Val)
head1 = head1.Next
}
for head2 != nil {
res2 = append(res2, head2.Val)
head2 = head2.Next
}
//逆序排列
ReverseIntSlice(res1)
ReverseIntSlice(res2)
//两个链表元素个数的差值。如果不同,则tmp !=0 会涉及到分别扩充两个切片0值的操作
tmp := max(len(res1), len(res2)) - min(len(res1), len(res2))
if len(res1) < len(res2) {
for i := 0; i < tmp+1; i++ {
res1 = append(res1, 0)
}
res2 = append(res2, 0)
}
if len(res1) > len(res2) {
for i := 0; i < tmp+1; i++ {
res2 = append(res2, 0)
}
res1 = append(res1, 0)
}
//初始化切片相加的和切片的长度,由于可能会进位,所以长度+1
res = make([]int, max(len(res1), len(res2))+1)
var count int
for i := 0; i < max(len(res1), len(res2)); i++ {
if res1[i]+res2[i] >= 10 {
res[i] = ((res1[i]+res2[i])%10 + count) % 10
count = 0
count++
} else {
if ((res1[i]+res2[i])%10 + count) >= 10 {
res[i] = ((res1[i]+res2[i])%10 + count) % 10
count = 0
count++
continue
}
res[i] = ((res1[i]+res2[i])%10 + count) % 10
count = 0
}
}
//相加过后逆序回来
ReverseIntSlice(res)
//生成链表
node := newListNode(res)
//链表第一个元素值为0,不符合输出格式
for node.Val == 0 {
node = node.Next
}
return node
}
//对传入的切片进行逆序排列操作
func ReverseIntSlice(res []int) {
var tmp int
if len(res)%2 == 0 {
for i := 0; i < len(res)>>1; i++ {
tmp = res[i]
res[i] = res[len(res)-1-i]
res[len(res)-1-i] = tmp
}
} else {
for i := 0; i < (len(res)-1)>>1; i++ {
tmp = res[i]
res[i] = res[len(res)-1-i]
res[len(res)-1-i] = tmp
}
}
}
// newListNode 根据传入的切片值生成一个单链表
func newListNode(arr []int) *ListNode {
var head ListNode
var pre ListNode
for _, num := range arr {
node := ListNode{Val: num, Next: nil}
if head.Next == nil {
head.Next = &node
}
if pre.Next == nil {
pre.Next = &node
} else {
pre.Next.Next = &node
pre = *pre.Next
}
}
return head.Next
}