【每日一题】2. Add Two Numbers

在这里插入图片描述

题目意思是,一个数用链表存储,低位存在链表头部,高位存在链表尾部,然后将两个数相加,返回相加后得到的新链表。

算法思路:分别遍历两个链表,将数的每一位加起来,就可以得到新链表。思路比较简单,现在捋捋细节

  • 可能出现进位:用一个数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的长度))

猜你喜欢

转载自blog.csdn.net/SJTUKK/article/details/109155408