本人数据结构也差不多还给老师了,因此也是看别人的代码才做出来。此题是两个单向的链表去求和。首先回顾下基本概念,链表是由多个结点组成的,每个结点存储着:值和指向下一个结点的指针。
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
根据题设,此时l1和l2都为指向头节点的指针,l1.val是值,l1.next是指向下一节点的指针。ListNode为一个结点类,因此可以先构建新链表的头节点:
sumnode = ListNode(l1.val+l2.val)
然后,将l1和l2指针移到下一个结点,在进行相加。此时存在两链表长短不一问题,只需要将短的链表后面置为0即可,还有当两个链表的尾结点还有进位情况(利用sumnode.val > 9在进行一次计算):
while (l1 and (l1.next!=None)) or (l2 and (l2.next!=None)) or sumnode.val > 9:
l1 = l1.next if l1 else l1
l2 = l2.next if l2 else l2
tmp = (l1.val if l1 else 0) + (l2.val if l2 else 0)
然后构建一个新的结点,连接到sumnode上。sumnode为当前结点,当前结点有进位就要加到下一节点,然后把当前结点的值取余。最后跟新当前结点sumnode:
sumnode.next = ListNode(sumnode.val//10 + tmp)
sumnode.val = sumnode.val%10
sumnode = sumnode.next
以下为全部代码,用时72ms,14.9mb:
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
sumnode = ListNode(l1.val+l2.val)
tr = sumnode
while (l1 and (l1.next!=None)) or (l2 and (l2.next!=None)) or sumnode.val > 9:
l1 = l1.next if l1 else l1
l2 = l2.next if l2 else l2
tmp = (l1.val if l1 else 0) + (l2.val if l2 else 0)
sumnode.next = ListNode(sumnode.val//10 + tmp)
sumnode.val = sumnode.val%10
sumnode = sumnode.next
return tr