需要注意的几点:
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 //返回链表
}