zoukankan      html  css  js  c++  java
  • 【Leetcode】2:两数相加(Python)

    题目:

     解题思路:首先对两个链表进行遍历,然后将数字转化为字符串加起来

         然后对整个字符串进行逆序,在逆序的同时赋值给新创建的链表

    代码如下:

    # 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:
            #首先对两个链表进行遍历,然后将数字转化为字符串加起来
            #然后对整个字符串进行逆序,在逆序的同时赋值给新创建的链表
            
            #首先考虑为0的情况
    
    
            #考虑链表不为0的情况
            l1_node=[]
            l2_node=[]
            #在储存进数组里的时候可以直接逆序
            while l1:
                l1_node.insert(0,str(l1.val))
                l1=l1.next
    
            while l2:
                l2_node.insert(0,str(l2.val))
                l2=l2.next
            #转化为整数进行相加
            zhengshu=''
            zhengshuer=''
            for i in l1_node:
                zhengshu=zhengshu+i
            
            for j in l2_node:
                zhengshuer=zhengshuer+j
    
            zhengshu=int(zhengshu)
            zhengshuer=int(zhengshuer)
    
            summ=str(zhengshu+zhengshuer)
            #将相加得到的整数再次变成字符串,并分割,分别赋值给新的链表
            ls=[]
            for i in summ:
                ls.append(i)
            node=ListNode(0)
            pointer=node
            #这里还要进行倒序一次
            i=len(ls)-1
            while i>=0:
                
                node.next=ListNode(int(ls[i]))
                node=node.next
                i=i-1
            
            return pointer.next

    得解:

     我这个方法还不太行,时间复杂度太大,用了四个并列的循环,之后再来想想有没有更好的办法。

    方法二:

    然后我看了官方的解答,直接使用初等数学方法求解,如下图所示:

     我们可以观察到链表l1和l2正好从前往后遍历得到的是个位,十位,百位数的数字位数,我们只要把遍历的结果从前往后分别相加到一个新的链表里就正好得到了我们新链表的结果,使用carry代表是否进位,carry=1就进位,carry=0就不进位。同时考虑,两个链表长度不相同的情况,于是可写出以下代码:

    # 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:
            #直接将对应链表元素进行相加,就正好相当于从个位数开始往上面加
            node = ListNode(0)
            pointer = node
            carry = 0
            while l1 != None or l2 != None:
                #那么向后移动到None了后,l2将不会具有val值,这该如何处理?
                if l1!=None and l2!=None:
                    if (l1.val + l2.val + carry) >= 10:
                        node.next = ListNode(l1.val + l2.val + carry - 10)
                        node = node.next
                        carry = 1
                    if (l1.val + l2.val + carry) < 10:
                        node.next = ListNode(l1.val + l2.val + carry)
                        node = node.next
                        carry = 0
                if l1==None:
                    if (l2.val + carry) >= 10:
                        node.next = ListNode(l2.val + carry - 10)
                        node = node.next
                        carry = 1
                    if (l2.val + carry) < 10:
                        node.next = ListNode(l2.val + carry)
                        node = node.next
                        carry = 0
                if l2==None:
                    if (l1.val + carry) >= 10:
                        node.next = ListNode(l1.val + carry - 10)
                        node = node.next
                        carry = 1
                    if (l1.val + carry) < 10:
                        node.next = ListNode(l1.val + carry)
                        node = node.next
                        carry = 0
                if l1 != None:
                    
                    l1 = l1.next
                if l2 != None:
                    l2 = l2.next
                    
            if carry == 1:
                node.next = ListNode(1)
                node = node.next
    
    
            return pointer.next

    最后的运行结果如下所示:

     发现运行用时比我自己想的办法还大,差一点就超时了,这个官方解答真是奇怪。

  • 相关阅读:
    Matlab绘制子图subplot使用攻略
    如何使用MATLAB对图片的RGB三种颜色进行提取
    matlab receive License Manager Error -103?
    MATLAB中conv2的详细用法 (以及【matlab知识补充】conv2、filter2、imfilter函数原理)
    matlab中repmat函数的用法
    VS调试时查看动态数组的全部元素
    c++中CString:: Find , ReverseFind, Left, Right
    C/C++ assert()函数用法总结
    c++中的GetModuleFileName函数的用法以及作用
    每天一个linux命令(58):telnet命令
  • 原文地址:https://www.cnblogs.com/geeksongs/p/13619876.html
Copyright © 2011-2022 走看看