题目意思是,一个数用链表存储,低位存在链表头部,高位存在链表尾部,然后将两个数相加,返回相加后得到的新链表。
算法思路:分别遍历两个链表,将数的每一位加起来,就可以得到新链表。思路比较简单,现在捋捋细节
- 可能出现进位:用一个数carry表示进位,相加后当前位置的数字为(n1 + n2 + carry) % 10, 而进位carry = (n1 + n2 + carry) // 10。当加到最高位的时候,也可能出现进位,这个时候新结点的值为carry
- 链表长度不一致:我们可以将较短的链表短于较长链表的那部分结点的值视作0
- 代码中指针q的作用是,当p到达最高位的时候,还会创建一个不为空的next的指针,这个时候我们需要用q记录p之前的结点,在最高位的时候将next指针置为空
# Definition for singly-linked list.
# 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:
p = head = ListNode() # p用来指示当前的结点
carry = 0
while(l1 or l2):
n1 = l1.val if l1 else 0 #l1不为空那么数值就为l1.val如果为空就为0
n2 = l2.val if l2 else 0
p.val = (n1 + n2 + carry) % 10
p.next = ListNode()
q = p # 用来记录p结点之前的结点,因为下一行中p变成了p.next
p = p.next
carry = (n1 + n2 + carry) // 10
l1 = l1.next if l1 else l1
l2 = l2.next if l2 else l2
if(carry > 0): #最高位还有进位
p.val = carry
else:
q.next = None #没有进位的话,把最高位的next指针置为空
return head
时间复杂度为:O(max(l1的长度,l2的长度))