LeetCode 热题 HOT 100 ------- 1. 两数之和、2、两数相加

在这里插入图片描述

//第二遍做题: 时间复杂度0(n^2) 空间复杂度0(1)
class Solution {
    public int[] twoSum(int[] nums, int target) {
        //首先写一个数组
        int[] index = new int[2];
        //遍历数组
        for(int i=0 ; i<nums-1 ; i++){
            for(int j=i+1 ; j<nums ; j++){
                if(target - nums[i] == nums[j]){
                    index[0] = nums[i];
                    index[1] = nums[j];
                } 
            }
        }
        return index;
    }
}
//再加一种方法,用哈希表  时间复杂度0(n) 0(n)
class Solution {
    public int[] twoSum(int[] nums, int target) {
        //用哈希表,数组值存为key,下标值存为value,也就是我们通过key来进行判断,返回value的值
        Map<Integer , Integer> map = new HashMap<Integer,Integer>();
        for(int i=0 ; i<nums.length ; i++){
            if(map.containsKey(target-nums[i])){
                return new int[]{map.get(target - nums[i]),i};
            }
            map.put(nums[i] , i);
        }
        return new int[0];
    }
}

在这里插入图片描述

//解题思路:此题相对简化,因为给了“逆序”,所以相对要好做一些,我们遍历两个链表,然后让相应节点的val相加
//然后看是否进位,是否进位用“carry”表示,然后定义两个空结点,一个后移,一个返回
//时间复杂度0(max(m,n))  空间复杂度0(1)不是O(n)

//总之就是说让他们对应位相加,直到其中一链表为空,然后把另一个链表移到当前链表上

/*
    注意点:
        1、两个节点,一个遍历节点一个头节点
        2、进位问题,并且最高位判断是否有进位
*/
class Solution {
    //这道题要注意进位,要注意字符串是否为空,要建立一个新的结点管理他们的相应结点的值,当其中一个链表短时,则后面用0替代
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //先写新的链表(注意是两个节点,一个遍历,一个返回头节点)
        ListNode temp = null;
        ListNode head = null;
        //进位
        int carry = 0;
        while(l1 != null || l2 != null){
            //怕有链表后面用0补充
            int n1 = l1 == null ? 0 : l1.val;
            int n2 = l2 == null ? 0 : l2.val;
            //计算当前结点的值
            int sum = n1 + n2 + carry;
            //求是否有进位
            int curVal = sum % 10;
            carry = sum/10;    //不能放前面
            //往新的链表上加
            //不过要和第一个点区别开来
            if(head == null){
                head= temp = new ListNode(curVal);
        
            }else{
                temp.next = new ListNode(curVal);
                temp = temp.next;
            }
            //往下面移动
            if(l1!=null)
                l1 = l1.next;
            if(l2!=null)
                l2 = l2.next;
            //然后尾部需要判断是否有进位
            if(carry > 0)
                temp.next = new ListNode(carry);
        }
        return head;

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值