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

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

数据结构 | 链表 | 问题2

问题描述

给定两个单向链表,每个节点包含一个数字,将它们相加并返回一个新的单向链表。

例如,链表1为 2 -> 4 -> 3,链表2为 5 -> 6 -> 4,其结果应该为 7 -> 0 -> 8

解决方案

为了求解问题2,我们可以从链表的头部依次遍历两个链表,将相同位置上的数字相加。如果和大于9,则将数字进位,即将此位置上的数字设置为 sum%10,将进位的数字 carry 设置为 1。

另外需要注意的一点是,如果两个链表长度不同,则需要在短链表的末尾添加0节点。

最后,在遍历两个链表的过程中,构造一个新的单向链表用以存放每个节点的和。

代码展示

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        # 在短链表末尾添加0节点
        cur1, cur2 = l1, l2
        while cur1 and cur2:
            cur1 = cur1.next
            cur2 = cur2.next
        if not cur1:
            while cur2:
                node = ListNode(0)
                node.next = l1
                l1 = node
                cur2 = cur2.next
        elif not cur2:
            while cur1:
                node = ListNode(0)
                node.next = l2
                l2 = node
                cur1 = cur1.next
        
        # 计算两个链表的和
        cur1, cur2 = l1, l2
        res = ListNode(0)
        cur3 = res
        carry = 0
        while cur1 and cur2:
            sum = cur1.val + cur2.val + carry
            carry = sum // 10
            node = ListNode(sum % 10)
            cur3.next = node
            cur3 = cur3.next
            cur1 = cur1.next
            cur2 = cur2.next
        
        # 处理链表余下的部分
        cur = cur1 if cur1 else cur2
        while cur:
            sum = cur.val + carry
            carry = sum // 10
            node = ListNode(sum % 10)
            cur3.next = node
            cur3 = cur3.next
            cur = cur.next

        # 处理进位
        if carry == 1:
            node = ListNode(1)
            cur3.next = node
        
        return res.next

总结

本题解决方案的主要思路是从链表的头部依次遍历,计算两个链表上相同节点位置的数字之和并存储到一个新的链表中。需要注意在遍历两个链表的过程中,对链表长度不同的情况进行特殊处理,以及在计算和的过程中需要处理数字进位的情况。