力扣LeetCode刷题日记(一)

1

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution:
    """
    dict_sum: 存储的是列表的值和对应的索引组成的键值对,key: 列表的值 
    从左至右遍历列表,检查target-nums[i]的值在字典dict_sum是否存在
    如果存在,返回[dict_num.get(target - nums[i]), i]
    如果不存在,将列表的值和对应的索引作为一对键值对存入字典
    """
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dict_num = {}
        for i, m in enumerate(nums):
            if dict_num.get(target - m) is not None:
                return [dict_num.get(target - m), i]
            dict_num[m] = i
        
    
        

2

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
        head = ListNode(0)
        p = head
        add = 0  # 两数相加后的进位
        
        while l1 and l2:
            p.next = ListNode((l1.val + l2.val + add) % 10)  # 两个数相加的个位数保存在新结点中
            add = (l1.val + l2.val + add) // 10
            p, l1, l2 = p.next, l1.next, l2.next
        
        # 退出while循环时,可能是l1的链表先结束,可能是l2的链表先结束,也可能两个一起结束
        # 把剩下的数都连接到l1后面
        if l1:  # l2的链表先行结束
            pass
        else:  # l2的链表先行结束
            l1 = l2
        
        while l1:
            p.next = ListNode((l1.val + add) % 10)
            add = (l1.val + add) // 10
            p, l1 = p.next, l1.next
        
        # 链表都计算结束后若还有进位
        if add != 0:
            p.next = ListNode(add)
            
        return head.next
        

你可能感兴趣的:(LeetCode刷题)