算法思路:
- 由于链表是从低位到高位, 我们可以逐位相加, 某一位为(l1.val + l2.val) % 10
- 由于存在进位问题, 需要设置一个变量作为进位, 其值为(l1.val + l2.val) // 10
- 如果在中途某个链表到头了, 那么就可以推出第一层循环, 循环单独的链表即可(这里可以使用将None补零, 来简化代码, 但是算法的复杂度并未简化)
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
c = 0
#这里新创建一个链表作为结果, head为其头结点
head = ListNode()
mid = head
# 第一层循环
while l1 is not None and l2 is not None:
p = ListNode()
p.val = (l1.val + l2.val + c) % 10
c = int((l1.val + l2.val + c) / 10)
mid.next = p
mid = mid.next
l1 = l1.next
l2 = l2.next
#第二层循环
while l1 is not None:
p = ListNode()
p.val = (l1.val + c) % 10
c = int((l1.val + c) / 10)
mid.next = p
mid = mid.next
l1 = l1.next
while l2 is not None:
p = ListNode()
p.val = (l2.val + c) % 10
c = int((l2.val + c) / 10)
mid.next = p
mid = mid.next
l2 = l2.next
#防止出现高位进位
if c == 1:
p = ListNode(1)
mid.next = p
return head.next
复杂度: 设链表长度分布为m, n, 由于该算法遍历了两个链表这复杂度为O(m+n)