• 2. Add Two Numbers


    1. 原始题目

    You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

    You may assume the two numbers do not contain any leading zero, except the number 0 itself.

    Example:

    Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
    Output: 7 -> 0 -> 8
    Explanation: 342 + 465 = 807.

    2. 题目理解

    就上题而言很清楚了,两个非负整数相加,结果存在新链表中,注意的是:

    1)进位,新建一个存放进位

    2)两个链表长短不同,就是两个位数不同的整数。例如:999999+120

    3. 解法

    思路:两个链表按位依次向右滑动,不必反转链表,再相加,这时最直观最麻烦的方法。其实可以直接相加,比如123+269 = 492和“321+962 = 294”性质一样,就是进位的时候,要进到链表的后面去。所亦可以写出如下的代码:

     1 # Definition for singly-linked list.
     2 # class ListNode:
     3 #     def __init__(self, x):
     4 #         self.val = x
     5 #         self.next = None
     6 
     7 class Solution:
     8     def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
     9         p = ListNode(0)
    10         head = p         # 保存最初的头结点,因为要返回头结点嘛
    11         q = 0            # 保存商(商需要进位到下一位)
    12         
    13         while(l1 and l2):         # 当两者都不为空,依次向右滑动指针
    14             q, r = (l1.val+l2.val+q)//10, (l1.val+l2.val+q)%10        # 分别保存商和余数
    15             p.next = ListNode(r)      # 余数放到当前结点,商还在q里面
    16             p = p.next
    17             l1 = l1.next
    18             l2 = l2.next              # 向右滑动
    19           
    20         l = l1 or l2       # 若l1或者l2还有剩余,继续上述操作
    21         while(l):
    22             q, r = (l.val+q) // 10, (l.val+q) % 10
    23             p.next = ListNode(r)
    24             p = p.next
    25             l = l.next
    26              
    27         if q>0:            # 若商大于0,需再开辟一个节点存放进位。例如 9+8 = 17  链表长为2,存放为7-1
    28             p.next = ListNode(q)
    29             
    30         return head.next

    写完之后可能看到代码冗余很大,因为有许多部份重复了,虽然时间复杂度很小了,但是代码不够美观,将上面代码中三处判断整合到一起:即l1不为空,l2不为空,q不为0只要满足一个条件就新开辟结点存放数据:

     1 class Solution:
     2     def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
     3         p = ListNode(0)
     4         head = p
     5         q = 0
     6         
     7         while(l1 or l2 or q):      # 满足之一即可
     8             total = (l1.val if l1 else 0) + (l2.val if l2 else 0) + q
     9             q = total // 10
    10             r = total % 10
    11             p.next = ListNode(r)
    12             p = p.next
    13             l1 = l1.next if l1 else l1
    14             l2 = l2.next if l2 else l2
    15                           
    16         return head.next    
    17     

    效果是一样的:验证如下:

     1 # 新建链表1
     2 listnode1 = ListNode_handle(None)
     3 s1 = [1,8,1,2,3,6]
     4 for i in s1:
     5     listnode1.add(i)
     6 listnode1.print_node(listnode1.head)
     7 
     8 # 新建链表2
     9 listnode2 = ListNode_handle(None)
    10 s2 = [9,4,6,3]
    11 for i in s2:
    12     listnode2.add(i)
    13 listnode2.print_node(listnode2.head)
    14 
    15 # 查看相加结结果
    16 s = Solution()
    17 head = s.addTwoNumbers(listnode1.head, listnode2.head)
    18 listnode = ListNode_handle(None)
    19 listnode.print_node(head)

    1 8 1 2 3 6
    9 4 6 3
    0 3 8 5 3 6

    还是,具体链表实现代码见博文

  • 相关阅读:
    Maven 跳过测试的几种方式
    Java Optional 初始为空
    Java 8 中的设计模式策略
    Java 8 开始新增的 Optional 类 Optional 对象中的返回
    关于AWSIAMcertificate证书的说明
    VUE 常规截取和特殊字符之前之后截取
    vue判断字符串中是否包含某个字符串
    图片文字居中显示
    获取Java对象中所有的属性名称和属性值
    12注册中心consul
  • 原文地址:https://www.cnblogs.com/king-lps/p/10655848.html
Copyright © 2020-2023  润新知