002 两数相加
【题目】给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
【解答】
设置一个进位参数 o p op op,再设置一个 c u r r e n t current current,用来记录当前节点。逆序相加,从高位开始相加,进位符向下传递。
-
两个链表长度可能不一致,先计算长度一样的;考虑到两个数相加可能有进位,所以初始化一个进位符 o p op op 。
op = 0 head = l1 while l1 and l2: sum = l1.val + l2.val + op op = sum//10 l1.val = sum % 10 current = l1 l1 , l2 = l1.next,l2.next
-
将当前的节点指向较长的链表,判断他是否为空且 o p op op是否大于0;如果 o p op op大于0,就将 o p op op与较长链表剩下的数字相加;如果 o p op op小于0,说明没有进位,当前的节点指向较长的链表,就将当前节点与较长链表剩下的节点连接起来了
if l1: current.next = l1 while l1 and op>0: s = l1.val + op l1.val = s % 10 op = s // 10 current = l1 l1 = l1.next else: current.next = l2 while l2 and op>0: s = l2.val + op l2.val = s % 10 op = s // 10 current = l2 l2 = l2.next
-
数据对应相加完成之后,检查最后的进位符是否大于0;如果大于0,将 o p op op转为节点 L i s t N o d e ( o p ) ListNode(op) ListNode(op),然后让当前节点的下一个节点指向 L i s t N o d e ( o p ) ListNode(op) ListNode(op)
if op > 0: op = ListNode(op) current.next = op
-
因为head指向的是 l 1 l_1 l1的头节点,所以直接返回 h e a d head head
return head