LeetCode2 链表两数相加

79 阅读1分钟

leetcode.cn/problems/ad… image.png

解法一:迭代法

主要考察链表双指针技巧,和加法运算过程中对进位的处理。 代码中还用到一个链表的算法题中是很常见的「虚拟头结点」技巧,也就是 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
}