Python实现数据结构与算法——两数相加II

题目描述:

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

进阶:

如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。

示例:
输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

链表逆序相加:即链表访问元素需要从前往后依次遍历,这个规则不会变,但是相加又要从后往前相加。核心想法分两步:

  1. 将链表里的元素从前到后的取出来
  2. 然后从后往前相加。

这种先进后出(后进先出)的数据存取过程,刚好可以用栈来实现。即先遍历链表,将数据从前往后依次取出并入栈,然后出栈相加。
代码如下:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        s1 = []
        s2 = []
        while l1:
            s1.append(l1.val)
            l1 = l1.next
        while l2:
            s2.append(l2.val)
            l2 = l2.next
        
        add_one = 0
        preNode = None
        while s1 or s2 or add_one != 0:
            num1 = 0 if not s1 else s1.pop()
            num2 = 0 if not s2 else s2.pop()
            add_nums = num1 + num2 + add_one
            add_one = add_nums//10
            cur_num = add_nums%10
            curNode = ListNode(cur_num)
            curNode.next = preNode
            preNode = curNode
        return curNode

测试结果:
Python实现数据结构与算法——两数相加II_第1张图片
时间复杂度:O(max(m,n))
空间复杂度:O(m+n),
其中 m 与 n 分别为两个链表的长度。

总结:

链表的逆序操作考虑用栈,这道题将结果合成链表时,需要定义两个节点,一个是当前节点,另一个是上一个节点。这里和正序不同的是,每次操作需要将当前节点的next指向上一个节点。

你可能感兴趣的:(数据结构与算法)