题目描述
给出两个非空的链表用来表示两个非负的整数。其中,他们各自的位置按照逆序的方式存储,并且它们的每个节点只能存储一位数。
如果,我们将这两个数相加起来,则会返回一个新的链表表示他们的和。
例如,输入(2->4->3)+(5->6->4)
输出:7 -> 0 -> 8
因为 342 + 465 = 807
主要思路
指针p,q分别是链表l1和l2的遍历指针,将p和q位置上结点的val相加,假如该数大于等于10,那么进位标记addflag=1,到下一个结点时,如果addflag==1,就会进1。
代码
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
l3 = None
# 用于返回建立的新链表
l3_ini = None
p, q = l1, l2
self.addflag = 0
while p and q:
num = p.val + q.val
newNode = ListNode(num%10)
# 如果该位置要进位
if self.addflag == 1:
newNode.val += 1
self.addflag = 0
# 这里检查进位后是否还要再进位
if newNode.val >= 10:
newNode.val = newNode.val % 10
self.addflag = 1
if l3 == None:
l3 = newNode
l3_ini = newNode
else:
l3.next = newNode
l3 = newNode
if num >= 10:
self.addflag = 1
p = p.next
q = q.next
# 当两数长度不一致时,将剩余部分加到链表中
while p:
newNode = p
if self.addflag == 1:
newNode.val += 1
self.addflag = 0
if newNode.val >= 10:
newNode.val = newNode.val % 10
self.addflag = 1
l3.next = newNode
l3 = newNode
p = p.next
while q:
newNode = q
if self.addflag == 1:
newNode.val += 1
self.addflag = 0
if newNode.val >= 10:
newNode.val = newNode.val % 10
self.addflag = 1
l3.next = newNode
l3 = newNode
q = q.next
# 解决例如两位数加两位数等于三位数的情况
if self.addflag == 1:
newNode = ListNode(1)
l3.next = newNode
l3 = newNode
self.addflag = 0
return l3_ini