题解 | #链表相加(二)#

链表相加(二)

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
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务