📜  数据结构|链表|问题9(1)

📅  最后修改于: 2023-12-03 15:40:01.529000             🧑  作者: Mango

数据结构 | 链表 | 问题9

问题描述

给定两个非空链表,表示两个非负整数。每个节点表示一位数,数字以相反的顺序存储,使得第一个数字的个位位于链表的头部。求这两个数字的和并以链表形式返回。

例如,给定的链表为:

    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)$。

总结

本题其实是一个很经典的问题,而且我们也可以将思想扩展到很多其他问题中。希望大家可以多多练习,熟练掌握链表的操作技巧。