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))
LeetCode 2. add two numbers && 单链表的更多相关文章
- LeetCode 2 Add Two Numbers(链表操作)
题目来源:https://leetcode.com/problems/add-two-numbers/ You are given two linked lists representing two ...
- LeetCode(2) || Add Two Numbers && Longest Substring Without Repeating Characters
LeetCode(2) || Add Two Numbers && Longest Substring Without Repeating Characters 题记 刷LeetCod ...
- 【LeetCode-面试算法经典-Java实现】【002-Add Two Numbers (单链表表示的两个数相加)】
[002-Add Two Numbers (单链表表示的两个数相加)] 原题 You are given two linked lists representing two non-negative ...
- [LeetCode] 445. Add Two Numbers II 两个数字相加之二
You are given two linked lists representing two non-negative numbers. The most significant digit com ...
- LeetCode:1. Add Two Numbers
题目: LeetCode:1. Add Two Numbers 描述: Given an array of integers, return indices of the two numbers su ...
- leetcode 题解 Add Two Numbers(两个单链表求和)
题目: You are given two linked lists representing two non-negative numbers. The digits are stored in r ...
- LeetCode第[2]题(Java):Add Two Numbers (链表相加)——Medium
题目难度:Medium 题目: You are given two non-empty linked lists representing two non-negative integers. The ...
- [leetCode][016] Add Two Numbers
[题目]: You are given two linked lists representing two non-negative numbers. The digits are stored in ...
- LeetCode 面试:Add Two Numbers
1 题目 You are given two linked lists representing two non-negative numbers. The digits are stored in ...
随机推荐
- angular2的ngfor ngif指令嵌套
angular2的ngfor ngif指令嵌套 ng2 结构指令不能直接嵌套使用,可使用<ng-container>标签来包裹指令 示例如下: <ul> <ng-cont ...
- Abp问题解决集合1
ABP学习经验 1. 视图中(控制器中直接使用仓储)会遇到使用实体外键,出现数据库连接关闭的错误 初学者经常会犯这样一个错误,没错说的就是我自己,这个问题折腾了我很长世间.还是没有细看文档,对ab ...
- ionic platform add ios, Error:spawn EACCES
RT: cordova ionic 环境搭建好之后,需要添加平台才能打包,添加平台如果出错:Error:spawn EACCES, 原因是因为没添加hooks, 请使用 ionic add hooks ...
- C++进阶--逻辑常数和比特位常数(Logical constness vs Bitwise constness)
对于什么是const函数,有两种理解 Logical constness 实际的数据没有没修改,如下面程序中的vector v Bitwise constness 类的成员变量没有被修改,包括int ...
- bzoj4980: 第一题
Description 神犇xzyo听说sl很弱,于是出了一题来虐一虐sl.一个长度为2n(可能有前缀0)的非负整数x是good的,当且仅当 存在两个长度为n(可能有前缀0)的非负整数a.b满足a+b ...
- java高并发编程(五)线程池
摘自马士兵java并发编程 一.认识Executor.ExecutorService.Callable.Executors /** * 认识Executor */ package yxxy.c_026 ...
- 使用jquery.mCustomScrollbar自定义滚动条(4)live使用,向未来元素添加滚动条,不实用,了解一下
.div_box元素是本来没有的,在滚动条初始化的时候方法是加在$('.content .div_box').mCustomScrollbar()上面,参数live:on; 点击按钮的时候,进行con ...
- vue-router2.0
在使用vue.js创建单页运用的时候,我们通常的做法是配合vue-router一起使用,通过vue-router将组建映射到路由并进行渲染. 例如我们要实现两个页面的切换跳转,就需要使用路由,这里不再 ...
- 学习笔记之Java
Java (programming language) - Wikipedia https://en.wikipedia.org/wiki/Java_(programming_language) Ja ...
- 廖雪峰Java2面向对象编程-6Java核心类-5枚举类
直接定义常量 public class Weekday { //定义int常量 public static final int SUN = 0; public static final int MON ...