零基础python刷leetcode -- 2. Add Two Numbers

算法很重要,但是每天也需要学学python,于是就想用python刷leetcode 的算法题,和我一起开始零基础python刷leetcode之旅吧。

2. Add Two Numbers

零基础python刷leetcode -- 2. Add Two Numbers_第1张图片
image.png

首先过一下python的一些基础知识,非小白请直接跳过

链表

从提示代码可以看出这里涉及到单链表结构,代码如下:

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None
  • 链表由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间。

  • 使用链表结构可以克服数组需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。

  • 但是链表失去了数组随机读取的优点

  • 同时链表由于增加了结点的指针域,空间开销比较大。

链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表 双向链表 以及 循环链表 。链表可以在多种编程语言中实现。

链表是数据结构中最基本常用的,C++语言中单链表是利用指针操作实现的,python作为面向对象编程的,可以使用创建一个ListNode类来实现链表,利用类的属性引用来代替指针操作。

零基础python刷leetcode -- 2. Add Two Numbers_第2张图片
链表

表头,指针,结点等概念请自行百度。

下面我们创建了一个节点类,然后编写了几个链表操作,包括创建,插入,删除,输出等。代码如下:

class ListNode():     # 初始化 构造函数  
    def __init__(self,value):  
        self.value=value  
        self.next=None
  
def Creatlist(n):  
    if n<=0:  
        return False  
    if n==1:  
        return ListNode(1)    # 只有一个节点  
    else:  
        root=ListNode(1)  
        tmp=root  
        for i in range(2,n+1):       #  一个一个的增加节点  
            tmp.next=ListNode(i)  
            tmp=tmp.next  
    return root            # 返回根节点  
  
def printlist(head):       # 打印链表 (遍历) 
    p=head  
    while p!=None:  
        print p.value  
        p=p.next  
  
def listlen(head):       # 链表长度  
    c=0  
    p=head  
    while p!=None:  
        c=c+1  
        p=p.next  
    return c  
  
def insert(head,n):         # 在n的前面插入元素  
    if n<1 or n>listlen(head):  
        return  
  
    p=head  
    for i in range(1,n-1):  # 循环四次到达 5  (只能一个一个节点的移动 range不包含n-1)
        p=p.next  
    a=raw_input("Enter a value:")  
    t=ListNode(value=a) 
    t.next=p.next   
    p.next=t   
    return head       
  
def dellist(head,n):  # 删除链表  
    if n<1 or n>listlen(head):  
        return head  
    elif n is 1:  
        head=head.next   # 删除头  
    else:  
        p=head  
        for i in range(1,n-1):    
            p=p.next     # 循环到达 2次   
        q=p.next  
        p.next=q.next    # 把5放在3的后面  
    return head  
  
  
def main():  
    print "Create a linklist"  
    head=Creatlist(7)  
    printlist(head)  
    print  
    print "___________________________"  
  
    n1=raw_input("Enter the index to insert")  
    n1=int(n1)  
    insert(head,n1)  
    printlist(head)  
    print  
    print "___________________________"  
  
    n2=raw_input("Enter the index to delete")  
    n2=int(n2)  
    dellist(head,n2)  
    printlist(head)  
  
  
if __name__=='__main__':  main()   # 主函数调用  

题目

这道题目是要将两个单链条相加。输出得到的新链条。

类似加法的原理, 我们从低位(链条第一位)开始,同位相加,满10高位+1

        ans = ListNode(0)
        tmp = ans
        tmpsum = 0
        while True:
            #依次遍历l1 l2,对应位相加
            if l1 != None:
                tmpsum += l1.val
                l1 = l1.next
            if l2 != None:
                tmpsum += l2.val
                l2 = l2.next
            tmp.val = tmpsum % 10     # 除10取余作为当前位的值
            tmpsum //= 10                #除10取整,即高位,作为指针的下个结点 进行加法运算
            if l1 == None and l2 == None and tmpsum == 0:
                break
            tmp.next = ListNode(0)
            tmp = tmp.next
        return ans

你可能感兴趣的:(零基础python刷leetcode -- 2. Add Two Numbers)