Leetcode刷题-2.两数相加-GO

需要注意的几点:

1.如果简单考虑把2个链表转为整数后相加,会遇到大整数计算问题,长度超过int64。(链表最高有100个节点)

2.链表长度不一定一样,遍历时要考虑List.Next为nil的情况。

3.按位将链表的值相加时,要考虑进位问题,尤其是最后一位。

GO语言

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
	overTen := 0                 // 进位
	var listSlice []int          // 切片存储链表l1、l2对应节点值的和
	l1nil, l2nil := false, false //判断链表下一个节点是否为空

	//循环遍历l1、l2链表
	for {
		//链表如果为空,Val值则为0
		if l1nil {
			l1.Val = 0
		}

		if l2nil {
			l2.Val = 0
		}

		//计算l1、l2节点值的和
		sum := l1.Val + l2.Val

		//如果前一个节点的计算需要进位,则这里计算进位
		if overTen == 1 {
			sum += overTen
			overTen = 0
		}

		//判断sum的值是否需要进位,如果需要则sum取个位数,并标记进位变量overTen为1
		if sum >= 10 {
			sum -= 10
			overTen = 1
		}

		//将sum的值顺序放入切片
		listSlice = append(listSlice, sum)

		//判断链表下一个节点是否位空。如果为空则设置l1nil、l2nil为true;如果不为空则将下一个节点赋值给l1、l2
		if l1.Next == nil {
			l1nil = true
		} else {
			l1 = l1.Next
		}

		if l2.Next == nil {
			l2nil = true
		} else {
			l2 = l2.Next
		}

		//如果l1、l2链表都遍历结束,则跳出循环
		if l1nil && l2nil {
			break
		}
	}

	sliceLen := len(listSlice) // 计算切片长度
	tailList := &ListNode{}    // 创建链表尾节点

	//将切片中的值倒序赋值给新的链表,链表也从尾部节点向头部节点赋值
	for i := sliceLen - 1; i >= 0; i-- {
		//如果链表最后一个节点计算下来需要进位,则这里需要额外创建一个尾部节点接收进位值
		if overTen == 1 {
			tailList.Val = 1 //接受进位值
			overTen -= 1     //进位标识符置为0
			i++              //i++,因为这里是创建一个新的尾部节点,不计入切片长度
		} else {
			tailList.Val = listSlice[i] //如果不需要进位,则直接赋值给尾部节点
		}

		/***
			新建尾部节点的前一个节点,并将尾部节点赋值给前一个节点。
			如果i=0,表示倒叙遍历到切片里的最后一个值了,则不需要创建前一个节点,break跳出循环。
		***/
		if i == 0 {
			break
		}
		newList := &ListNode{}  //新建前一个节点
		newList.Next = tailList //将尾部节点赋值给前一个节点
		tailList = newList      //将前一个节点赋值给尾部节点,因为下一次循环还是要将值赋值给“尾部节点”的Val
	}
	return tailList //返回链表
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值