445. 两数相加 II

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

进阶:

如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7

解答

两个链表应该从各位想加,先将两个链表反转

构造一个头节点(不参与计算),定义一个进位变量,
循环条件,两个反转后的链表节点和进位变量有一个不是空的,那么我们给结果链表增加一个节点记录数值

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
    a := singly(l1)
    b := singly(l2)
    c := &ListNode{}
    res := c
    jinwei := 0
    for a != nil || b!=nil || jinwei != 0 {
        c.Next = &ListNode{}
        c = c.Next
        if a != nil {
            c.Val = a.Val
            a = a.Next
        }
        if b != nil {
            c.Val = c.Val + b.Val
            b = b.Next
        }
        c.Val += jinwei
        jinwei = c.Val/10
        c.Val %= 10
    }
    return singly(res.Next)
}

func singly(head *ListNode) *ListNode {
    var pre *ListNode
    for head != nil {
        head.Next,head,pre = pre, head.Next, head
    }
    return pre
}

进阶