解法一:迭代法
主要考察链表双指针技巧,和加法运算过程中对进位的处理。
代码中还用到一个链表的算法题中是很常见的「虚拟头结点」技巧,也就是 dummy 节点。有了这个占位符,可以避免处理初始的空指针情况,降低代码的复杂性。这在很多合并链表生成一个新结果链表的题目中很常见。
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
p1, p2 := l1, l2
dummy := &ListNode{} // 虚拟头节点
cur := dummy // 该指针负责构建新链表
jinwei := 0 // 记录进位值
for p1 != nil || p2 != nil || jinwei > 0{ // 有一个不是空节点,或者还有进位,就继续迭代
tmp := jinwei // 和先带上上一步的进位值
if p1 != nil{
tmp += p1.Val
p1 = p1.Next
}
if p2 != nil{
tmp += p2.Val
p2 = p2.Next
}
// 处理本次进位
jinwei = tmp/10
tmp = tmp % 10
// 构建新节点,加入结果链表中
cur.Next = &ListNode{
Val: tmp,
}
// 处理下一节点
cur = cur.Next
}
// 返回结果链表的头结点(去除虚拟头结点)
return dummy.Next
}