目录
1、序言
引用大学室友的名言:人生啊,就是如此的艰难与困苦。现在发现刷题也是进入好公司的必备环节了(前几天面试一个北京公司,问了我几道题,答的相当垃圾,虽然自己不想去北京,但是这次面试还是很有警醒意味的,而且之后还被兄弟嘲笑彩笔,555~),自己是野路子出生(非科班)的算法工程师,一些基础的东西还是不行。所以我要刷leetcode了。这里会记录leetcode 1~100道里面的中等难度以上的题。
2、两数相加
2.1 题目
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
2.2 思路
自己认为有两种思路,第一种是将链表转化为数字,然后相加,然后倒序输出并转化为链表。第二种是直接在链表的每个节点对应相加,逢10进1!
2.3 解题
思路一:
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
l1_num = self.get_num(l1)
l2_num = self.get_num(l2)
reversed_result = l1_num + l2_num
result_string = str(reversed_result)[::-1]
listnode = ListNode(int(result_string[0]))
result = listnode
if len(result_string) == 0:
result
for i in range(1, len(result_string)):
listnode.next = ListNode(int(result_string[i]))
listnode = listnode.next
return result
def get_num(self, ln):
ln_list = []
while ln:
val = ln.val
ln = ln.next
ln_list.append(str(val))
ln_num = int(''.join(ln_list))
return ln_num
但是思路一没有通过以下case,如果有兴趣你们可以按照这个思路继续完善(假设有人看~),思路一比较麻烦。
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
思路二 :
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
flag = 1
result = ret = ListNode()
advance = 0
while flag:
l1_val = l1.val
l2_val = l2.val
if (l1_val + l2_val + advance) >= 10:
ret.next = ListNode((l1_val + l2_val +advance)%10)
advance = 1
else:
ret.next = ListNode(l1_val + l2_val)
ret.next.val += advance
advance = 0
if l1.next == None and l2.next == None and advance==0:
flag = 0
else:
l1 = l1.next if l1.next else ListNode()
l2 = l2.next if l2.next else ListNode()
ret = ret.next
return result.next
2.4 结果
执行结果:通过
显示详情
执行用时:80 ms, 在所有 Python3 提交中击败了30.77%的用户
内存消耗:14.8 MB, 在所有 Python3 提交中击败了65.49%的用户
代码效率不高,也提交测试了好多次,哎,通过就行了~