zoukankan      html  css  js  c++  java
  • LeetCode 2. add two numbers && 单链表

    add two numbers

    看题一脸懵逼,看中文都很懵逼,链表怎么实现的,点了debug才看到一些代码

    改一下,使本地可以跑起来

    # Definition for singly-linked list.
    class ListNode:
        def __init__(self, x):
            self.val = x
            self.next = None
    
    class Solution:
        def addTwoNumbers(self, l1, l2):
            """
            :type l1: ListNode
            :type l2: ListNode
            :rtype: ListNode
            """
            print(listNodeToString(l1))
            print(l1.val)
            print(l1.next.val)
            
    
    def stringToListNode(input):
        numbers=input
        # Now convert that list into linked list
        dummyRoot = ListNode(0)
        ptr = dummyRoot
        for number in numbers:
            ptr.next = ListNode(number)
            ptr = ptr.next
    
        ptr = dummyRoot.next
        return ptr
    
    def listNodeToString(node):
        if not node:
            return "[]"
    
        result = ""
        while node:
            result += str(node.val) + ", "
            node = node.next
        return "[" + result[:-2] + "]"
    
    def main():
    
        while True:
            try:
    
                line = [2,4,3]
                l1 = stringToListNode(line);
                line = [5,6,4]
                l2 = stringToListNode(line);
                
                ret = Solution().addTwoNumbers(l1, l2)
    
                out = listNodeToString(ret);
                print(out)
    
                #throw
                raise StopIteration
            except StopIteration:
                break
    
    if __name__ == '__main__':
        main()
    
    
    
    第1次提交
    # Definition for singly-linked list.
    class ListNode:
        def __init__(self, x):
            self.val = x
            self.next = None
    
    ############## start ##############
            
    def listNodeToInt(listN):
        '''链表转整数'''
        result=0
        i=0
        node=listN
        while True:
     
            if not isinstance(node,ListNode):
                break
            result += node.val*10**i
            node=node.next
            i+=1
    
        return result
    
    def intToListNode(num):
        '''整数转链表,抄袭stringToListNode '''
        dummyRoot = ListNode(0)
        ptr = dummyRoot
        while True:
            if num == 0:
                break
            number=num%10
            num=num//10
    
            ptr.next = ListNode(number)
            ptr = ptr.next
    
        ptr = dummyRoot.next
        return ptr
        
    
    class Solution:
        def addTwoNumbers(self, l1, l2):
            """
            :type l1: ListNode
            :type l2: ListNode
            :rtype: ListNode
            """
            #list1=listNodeToString(l1)
            #print(list1)
    
    
            i1=listNodeToInt(l1)
            i2=listNodeToInt(l2)
            i3=i1+i2
            #print(i1,i2)
            #print(i3)
            l3=intToListNode(i3)
            #print(listNodeToString(l3))
    
            return l3
    
    ##############  end  ##############   
    
    def stringToListNode(input):
        numbers=input
        # Now convert that list into linked list
        dummyRoot = ListNode(0)
        ptr = dummyRoot
        for number in numbers:
            ptr.next = ListNode(number)
            ptr = ptr.next
    
        ptr = dummyRoot.next
        return ptr
    
    def listNodeToString(node):
        if not node:
            return "[]"
    
        result = ""
        while node:
            result += str(node.val) + ", "
            node = node.next
        return "[" + result[:-2] + "]"
    
    def main():
    
        while True:
            try:
    
                line = [2,4,3]
                l1 = stringToListNode(line);
                line = [5,6,4]
                l2 = stringToListNode(line);
                
                ret = Solution().addTwoNumbers(l1, l2)
    
                out = listNodeToString(ret);
                print(out)
    
                #throw
                raise StopIteration
            except StopIteration:
                break
    
    if __name__ == '__main__':
        main()
    
    

    加了两个函数整数转链表和链表转整数

    Wrong Answer:

    Input:
    [0]
    [0]
    Output:
    []
    Expected:
    [0]
    

    应该是整数转链表时num==0直接跳过了,在前面用number当个标志位就好了

    def intToListNode(num):
        '''整数转链表,抄袭stringToListNode '''
        dummyRoot = ListNode(0)
        ptr = dummyRoot
        number=-1
        while True:
            if num == 0:
                if number==-1:
                    ptr.next=ListNode(0)
                break
            number=num%10
            num=num//10
    
            ptr.next = ListNode(number)
            ptr = ptr.next
    
        ptr = dummyRoot.next
        return ptr
    

    提交AC。

    总结:学到了链表??既然没学懂,就去弄个链表。

    #
    
    class Node(object):
        '''节点类'''
    
        def __init__(self,data, pnext=None):
            '''
            	data: 节点保存的数据
            	_next: 保存下一个节点对象
            '''
            self.data = data
            self._next = pnext
    
        def __repr__(self):
            return str(self.data)
    
    class ListNode(object):
        '''链表类'''
        def __init__(self):
        	self.head=None
        	self.lenght=0
    
        def isEmpty(self):
        	'''判断是否为空'''
        	return (self.length==0)
    
        def append(self,data):
            '''增加一个节点'''
            item=None
            if isinstance(data,Node):
                item = data
            else:
                item = Node(data)
    
            #如果头不存在
            if not self.head:
                self.head = item
                self.length = 1
            else:
                # 如果存在找到末尾然后添加节点
                node = self.head
                while node._next:
                    node = node._next
                node._next=item
                self.length+=1
    
        def delete(self,index):
            '''删除一个节点'''
            if self.isEmpty():
                print("listNode is empty")
                return False
    
            # 删除头节点
            if index == 0:
                self.head=self.head._next
                self.length-=1
                return True
    
            j=0
            node = self.head
            prev = self.head
            while node._next and j<index:
                prev=node
                node=node._next
                j+=1
    
            if j==index:
                prev._next = node._next
                self.length-=1
    
        def getNode(self,index,data=None,update=False):
            '''查找节点'''
            if self.isEmpty():
                print("listNode is empty")
                return False
            j=0
            node=self.head
            while node._next and j<index:
                node = node._next
                j+=1
    
            # 更新
            if update:
                if j==index:
                    node.data=data
                return   
    
            return node.data
            
    
        def update(self,index,data):
            '''更新节点'''
            self.getNode(index,data,True)
    
        def getIndex(self,data):
            '''查找索引'''
            if self.isEmpty():
                print("listNode is empty")
                return False
            
            # 索引列表
            index=[]
    
            j=0
            node=self.head
            while node:
                if node.data == data:
                    index.append(j)
                node=node._next
                j+=1
    
            indexLen=len(index)
            if indexLen==0:
                return False
            elif indexLen==1:
                return index[0]
            else:
                print(" index not only , is list. ")
                return index
    
        def insert(self,index,data):
            '''插入节点'''
            if self.isEmpty():
                print("listNode is empty, so append data")
                index=0
                self.head=None
                self.append(data)
                return True
    
            item = None
            if isinstance(data,Node):
                item = data
            else:
                item = Node(data)
    
            if index==0:
                item._next = self.head
                self.head = item
                self.length += 1
    
            j = 0
            node = self.head
            prev = self.head
            while node._next and j<index:
                prev=node
                node=node._next
                j+=1
    
            if j == index :
                item._next = node
                prev._next = item
                return True 
    
        def clear(self):
            self.head = None
            self.length = 0
    
    
        def __repr__(self):
            '''字符串'''
            if not self.head:
                return ' empty listNode '
    
            s=[]
            node = self.head
            while node:
                s.append(str(node.data))
                node = node._next
                
            return " -> ".join(s)
    
        def __getitem__(self,index):
            '''索引取值'''
            return self.getNode(index)
    
        def __setitem__(self,index,value):
            '''设置值'''
            print(index)
            self.update(index,value)
    
    if __name__ == '__main__':
    
        # 创建链表
        chain=ListNode()
    
        # 添加数据
        print("add 10 numbers")
        for i in range(10,20):
            chain.append(i)
        
        print(chain)    
    
        # 查找索引
        print("value eq 12 is index = ",end=" ")
        print(chain.getIndex(12))
    
        # 更新上面查找的索引
        print("update  ")
        index=chain.getIndex(12)
        if isinstance(index,int):
            chain.update(index,99)
    
        # 再次查找索引
        print("again, value eq 12 is index = ",end=" ")
        print(chain.getIndex(12))
    
    
        print(" because listNode is : ")
        print(chain)
    
        # 删除一个索引
        print("delete index 0")
        chain.delete(0)
        print(chain)
    
        # insert
        print("insert data")
        chain.insert(1,9)
        print(chain)
         
        # 直接索引获取值
        print("use [] get data")
        print(chain[3])
    
        # 直接设置值
        print("append same value")
        chain.append(90)
        chain.append(90)
        print(chain)
    
        # 查找相同值索引
        print("search 90 index")
        print(chain.getIndex(90))
        
    


    参考python数据结构之链表(一)

  • 相关阅读:
    Execl获取真实行数
    日期工具类
    Eclipse & IDEA快捷键对比大全
    【转】IDEA导入Eclipse项目 详细步骤(亲自验证导入成功)
    京东的四大集团
    马云演讲视频
    阿里系的一些重要网站
    阿里系的几个电商网站
    腾讯几款QQ软件
    电脑版微信使用说明
  • 原文地址:https://www.cnblogs.com/warcraft/p/9346963.html
Copyright © 2011-2022 走看看