LeetCode 1.2.题-两数之和-两数相加

1.两数之和

输入:nums = [2,7,11,15], target = 9
输出:[0,1]   #输出nums中两数之和为target的下标

我自己想到的解法算是暴力解法:

  • 记录nums中一个值为a1,a2=target-a1
  • 遍历除a1以外的值,判断是否与a2相等
  • 获取a1和a2的下标值并输出

有两点注意:

  • 第二个for循环的范围是从i之后开始的,这样保证不会出现相同下标值
  • 若获得a1、a2后则跳出循环(break),否则开始下一循环(continue)
class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        out=[0,0]
        lens=len(nums)
        for i in range(lens):
            a2=target-nums[i]
            for j in range(i+1, lens):
                if nums[j]==a2:
                    out[1]=j
                    out[0]=i
                    break
                elif nums[j] != a2:
                    continue
            
        return out 

优化方法是使用哈希查找降低时间复杂度:

def twoSum(nums, target):
    hashmap={}      #创建一个hashmap
    for index,value in enumerate(nums):
        #判断hashmap中有a2这个值
        if hashmap.get(target - value) is not None:
            return [index,hashmap.get(target - value)]
        #没有a2时就将nums和其下标存储到hashmap中
        hashmap[value] = index 

      

2.两数相加

题目描述

知识点:

单链表

链表:每个节点有两个属性data和next,在创建ListNode类时包含着两个属性。每调用一次ListNode()就向该对象中添加了一个节点Node。

node1 = ListNode(2)
node2 = ListNode(4)
node3 = ListNode(3)

更改链表值时,涉及到指针的概念,这里我的理解是,定义两个空链表,一个用来在循环时赋值和移动指针到下一位置,这样才能改变链表的内容,最后遍历结束后指针指向链表的尾部。另一个链表用来最后return值,因为这个链表的指针指向链表头,调用next属性时才能输出内容。 

 解题思路:

  • 利用l1.val获得节点的值,
  • 将l1和l2每个节点值和flag相加,得到sum
  • 设置flag的值为sum取整(判断是否进位)
  • 将sum赋值给节点,将指针指向循环变量L 下一节点
  • 判断l1、l2是否遍历结束,未结束时将指针指向下一节点
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        lis = L = ListNode(0) #初始化两个链表,一个用来return,一个用来循环遍历
        flag = 0          #定义一个进位项
        while (l1 or l2 or flag):
            # x = l1.val if l1 else 0
            if l1:
                x = l1.val
            else:
                x=0
            # y = l2.val if l2 else 0
            if l2:
                y = l2.val
            else:
                y=0
            sum = flag+x+y
            flag = sum//10              #清空flag
            L.next=ListNode(sum%10)     #生成一个节点
            L = L.next                  #指针指向下一个节点
            if(l1!=None):l1 = l1.next   #以防l1和l2指针长度不一样导致相加错误
            if(l2!=None):l2 = l2.next
        if (flag>0):
            L.next=ListNode(1)          #判断最高位是否需要进位
        return lis.next

sum的值可以简化为一句代码得到:

sum += (l1.val if l1 else 0) + (l2.val if l2 else 0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

icecreamdinner

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值