**
两数相加
**
题目:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
分析:
小编在学习数据结构的时候用伪码和C实现过链表的各种操作,但是拿到Python语言以后由于Python中没有指针这一概念,这道链表的题困扰了小编好久。最后还是求助了网上的教程才通过了这道题。
其实这道题本身并不难,只是现在动态语言中没有了指针这个概念,导致可能有的同学无从下手。
由于我们在做加法的时候是从个位加起,而本题中的链表是倒序的,表头正是个位,也就是两个表从表头开始依次向后遍历,对应位置做加法即可。
这里要注意的就是个位数相加可能会出现进位的情况,(0-9)+(0-9)最大的情况是9+9=18.所以’进位’这个变量最多为1。
python3代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
if l1 is None:#若l1表为空则为0+l2表,直接返回l2
return l2
if l2 is None:若l2表为空则为l1表+0,直接返回l1
return l1
head = ListNode(0)#初始化头结点
l = head#设置一个辅助指针为l
carry = 0#初始化进位变量'carry'
while l1 or l2 or carry:#当l1不为空或l2不为空或进位不为空时循环
sum0 = carry#初始化'和'变量sum0 每次循环前使其等于上一轮的carry。达到进位的目的。
carry = 0#carry在将上一轮的值交给sum0后重新置为0.
if l1 is not None:#若l1尚未被遍历结束,取出val累和给sum0,并将指针指向下一节点。
sum0 = sum0 + l1.val
l1 = l1.next
if l2 is not None:若l2尚未被遍历结束,取出val累和给sum0,并将指针指向下一节点。
sum0 = sum0 + l2.val
l2 = l2.next
if sum0 >= 10:#如果求和大于等于10,则需要进位,将carry置为1,并给sum0-10。
carry = 1
sum0 = sum0 - 10
l.next = ListNode(sum0)#将处理后的sum0付给一个新实例化的节点,并将该节点赋给指向上次循环的指针l的下一位。
l = l.next#l向后移一位。
return head.next#将从头结点的下一节点开始的链表返回。