力扣-leetcode刷题记录/两数之和-两数相加-python3

文章目录

    • 1 两数之和
    • 2.两数相加

1 两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
要求:假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
实例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解决办法:
首先想到的是两个for循环,直接暴力查找,但是与要求不符,数组中同一个元素不能使用两遍。
于是可以用target减去一个数,然后寻找另一个数的位置(要注意一个数不能用两边,也就是说[3,2,4,9],
查找target,应该返回(1,2)而不是(0,0)).
也可以使用哈希表在python中列表字典的即为哈希类型。(建一个新的字典,然后依次查找,如果不在字典内就继续查找)

class Solution(object):
        def twoSum(self,s,target):
                l = len(s)
                for i in range(l):
                        t = target - s[i]
                        try:
                                a = s[i] 
                                s[i] = ' '
                                j = s.index(t)
                                s [i] = a 
                                return (i, j)
                        except ValueError as e:
                                if i == l-1:
                                        raise 'No target'
                                else:
                                        continue

在这里插入图片描述

2.两数相加

题目描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

首先时使用链表,python定义链表,也就是多一个属性next,当作指针,指针的移动是指向了下一个实例。
题目中是倒序存放也就是说,需要尾插法。
尾插法概念:

'每次向尾部插入,且需要两个指针都指向头节点,一个指针保持不动,一个指针随着插入节点不断移动,保持一直在最后一个节点'
C语言示例:
#LinkList L
	int x;
	L = (LNode*)malloc(sizeof(LNode));
	LNode *s,*r=L;#s, r都指向头节点
	scanf("%d",&x);
	while(x!=9999){                             
		s=(LNode*)malloc(sizeof(LNode));     //创建新的结点 
		s->Data=x;                           
		r->Next=s;                      
		r=s;#每次需要移动r指针,保持r指针在最后一个
		scanf("%d",&x);#输入要插入节点的值
		}

解决办法:

class ListNode(object):
    
    def __init__(self,x):
        self.val = x
        self.next = None

class Solution(object):

    def addTwoNumber(self,l1,l2):
        #carry 用于同级节点的相加,也用于判断在链表下一个节点是否需要加1
        #carry 记录最后是否需要增加新节点(最后首位统计相加之后超过10,
        # 用divmod取进位的1,然后判断需要新增加节点存放1)
        carry = 0
        # 这里的执行顺序是res = ListNode(0), pre = res
        res = pre = ListNode(0)
        while l1 or l2 or carry:
            #判断l1,l2是否为空,非空时再赋值
            if l1:
                #调用时需要定义l1的各个节点
                #节点的赋值给carrry
                carry += l1.val
                l1 = l1.next
            if l2:
                #l1与l2同级节点的相加
                carry += l2.val
                l2 = l2.next
            # divmod返回商与余数的元组,分别赋值给carry, val
            carry, val = divmod(carry, 10)
            #新建节点用于存放l1与l2同级节点的相加的值(不超过10的部分)
            #pre.next = ListNode(val), pre = pre.next(尾插法,pre指针每次向后移动)
            pre.next = pre = ListNode(val)
        #res指针还处于头节点位置,因此每次返回res.next(但输出是需要每次移动res指针res = res.next)
        return res.next

#外部调用时不会执行
if __name__ == '__main__':
    #定义链表
    l1 = ListNode(4)
    l1.next = l11 = ListNode(5)
    l11.next = l12 = ListNode(6)

    l2 = ListNode(6)
    l2.next = l21 = ListNode(4)
    l21.next = l22 = ListNode(3)

    res = Solution().addTwoNumber(l1,l2)

    #输出
    while res:

        print(res.val)
        res = res.next

你可能感兴趣的:(剑指offer,leetcode)