📅  最后修改于: 2023-12-03 15:40:01.529000             🧑  作者: Mango
给定两个非空链表,表示两个非负整数。每个节点表示一位数,数字以相反的顺序存储,使得第一个数字的个位位于链表的头部。求这两个数字的和并以链表形式返回。
例如,给定的链表为:
2 -> 4 -> 3
表示数字 342。
我们可以使用两个指针分别遍历两个链表,将两个结点的值相加,并记录进位(若有的话),然后将和的个位作为新的结点插入新链表中。最后需要注意的是,若最高位有进位,则需要再插入一位。
以下为示例代码实现。建议先用笔模拟一下过程,更好理解。
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:
carry = 0
dummy = ListNode(0)
curr = dummy
while l1 or l2:
val1 = l1.val if l1 else 0
val2 = l2.val if l2 else 0
sum_val = val1 + val2 + carry
carry = sum_val // 10
sum_val %= 10
curr.next = ListNode(sum_val)
curr = curr.next
if l1: l1 = l1.next
if l2: l2 = l2.next
if carry:
curr.next = ListNode(carry)
return dummy.next
算法的时间复杂度为 $O(N)$,其中 $N$ 为两个链表的最长长度。空间复杂度为 $O(1)$。
本题其实是一个很经典的问题,而且我们也可以将思想扩展到很多其他问题中。希望大家可以多多练习,熟练掌握链表的操作技巧。