📅  最后修改于: 2023-12-03 15:12:35.912000             🧑  作者: Mango
该题目要求我们编写一个程序,实现对链表的操作,每个节点只包含一个数字(0或1)和一个指针,指向下一个节点。我们需要实现以下内容:
为了使程序的时间复杂度为O(max(len(l1), len(l2))),我们需要先对两个链表进行预处理,使其对齐。
我们可以用两个指针分别指向两个链表的头节点,然后比较节点数量,如果数量不一致,就在较短的链表后面添加若干个0节点,使其与较长的链表长度相等。
接下来,我们就可以从最低位向最高位遍历链表,并将相加的结果存储在新的链表中。我们还需要注意进位的情况。
可以用一个变量carry表示进位,carry初始值为0,当两个节点相加的和大于等于2时,carry的值为1。然后将两个节点相加的和取余数后,加上carry的值,就是新链表节点上的值。
值得注意的是,当最高位相加时,也需要考虑进位的情况。
下面是该算法的Python实现代码:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def addTwoNumbers(l1: ListNode, l2: ListNode) -> ListNode:
# make two lists have the same length
len1, len2 = 0, 0
node1, node2 = l1, l2
while node1 or node2:
if node1:
len1 += 1
node1 = node1.next
if node2:
len2 += 1
node2 = node2.next
if len1 < len2:
l1, l2 = l2, l1
for i in range(abs(len1 - len2)):
node = ListNode(0)
node.next = l2
l2 = node
# add two numbers
carry = 0
node1, node2 = l1, l2
result = ListNode()
cur = result
while node1 or node2:
val1 = node1.val if node1 else 0
val2 = node2.val if node2 else 0
carry, val = divmod(val1 + val2 + carry, 2)
cur.next = ListNode(val)
cur = cur.next
if node1:
node1 = node1.next
if node2:
node2 = node2.next
if carry:
cur.next = ListNode(carry)
return result.next
代码中使用了一个ListNode类来表示链表节点,addTwoNumbers方法实现了对两个链表的相加,并返回一个新链表。
该算法的时间复杂度满足要求,为O(max(len(l1), len(l2))),空间复杂度为O(max(len(l1), len(l2))),同时比较容易理解和实现。
由于题目要求链表中的数字为二进制,我们也可以用位运算来实现。不过无论使用何种方法,都需要考虑进位的情况。