LeetCode刷题(448,21,83,141,142,160)

448. 找到所有数组中消失的数字icon-default.png?t=M0H8https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array/

难度简单886

给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。

解法一:利用数组存储元素信息

class Solution {
    public List findDisappearedNumbers(int[] nums) {
        //方法一我们采用一个数组对原有数组中的元素进行存储
        Integer[] arr=new Integer[nums.length];
        HashSet hashSet=new HashSet<>();
        List list=new ArrayList<>();
        for (int i=0;i

LeetCode刷题(448,21,83,141,142,160)_第1张图片

解法二:

 

public List findDisappearedNumbers(int[] nums) {
        //我们把数组中元素的下标的元素加上一个数组长度,当然,再下一次循环使用的时候要将其变回来,否则会导致数组越界
        int n=nums.length;
        for (int i:nums){
            int x=(i-1)%n;//真正的可以使用的下标
            nums[x]+=n;
        }
        List list=new ArrayList<>();
        for (int i=0;i

LeetCode刷题(448,21,83,141,142,160)_第2张图片

 

21. 合并两个有序链表

难度简单2163

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

解法一:

class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
    ListNode fakeHead=new ListNode(0);
            ListNode last=fakeHead;
            ListNode cur1=list1;
            ListNode cur2=list2;
            while (cur1!=null&&cur2!=null){//谁的值小把谁插入到新的链表中
                if (cur1.val

LeetCode刷题(448,21,83,141,142,160)_第3张图片

 解法二:

public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        if (list1==null){
            return list2;
        }
        if (list2==null){
            return list1;
        }
        if (list1.val

LeetCode刷题(448,21,83,141,142,160)_第4张图片

83. 删除排序链表中的重复元素

难度简单720

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。

public ListNode deleteDuplicates(ListNode head) {
        ListNode cur=head;
        while (cur!=null&&cur.next!=null){
            if (cur.val==cur.next.val){
                cur.next=cur.next.next;
            }else {
                cur=cur.next;
            }
        }
        return head;
    }

 LeetCode刷题(448,21,83,141,142,160)_第5张图片

LeetCode刷题(448,21,83,141,142,160)_第6张图片 

public class Solution {
    public boolean hasCycle(ListNode head) {
        ListNode cur=head;//解法一,利用hashset进行存储,若出现相同元素直接返回false
        HashSet hashSet=new HashSet();
        while (cur!=null){
            if (hashSet.contains(cur)){
                return true;
            }
            hashSet.add(cur);
            cur=cur.next;
        }
        return false;//不是循环链表
    }
}

 LeetCode刷题(448,21,83,141,142,160)_第7张图片

 

public boolean hasCycle(ListNode head) {
        //使用快慢指针
        ListNode cur1=head;//快指针,一次走两步
        ListNode cur2=head;//慢指针,一次走一步
        while (cur1!=null&&cur1.next!=null){
            cur1=cur1.next.next;
            cur2=cur2.next;
            if (cur1==cur2){
                return true;
            }
        }
        return false;
    }

LeetCode刷题(448,21,83,141,142,160)_第8张图片

 LeetCode刷题(448,21,83,141,142,160)_第9张图片

 

public ListNode detectCycle(ListNode head) {
        //使用快慢指针
        ListNode cur1=head;//快指针,一次走两步
        ListNode cur2=head;//慢指针,一次走一步
        while (cur1!=null&&cur1.next!=null){
            cur1=cur1.next.next;
            cur2=cur2.next;
            if (cur1==cur2){
                cur1=head;//此处涉及一部分数学推导,建议去leetcode查看,将快指针置为慢指针,下一次相遇便是环形节点
                while (cur1!=cur2){
                    cur1=cur1.next;
                    cur2=cur2.next;
                }
                return cur1;
            }
        }
        return null;

    }

LeetCode刷题(448,21,83,141,142,160)_第10张图片

LeetCode刷题(448,21,83,141,142,160)_第11张图片 

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        //解法一:利用hashset不可重复存储的特型
        HashSet hashSet=new HashSet();
        //双指针,分别遍历添加至hashset
        ListNode cur1=headA;
        ListNode cur2=headB;
        while (cur1!=null){
            hashSet.add(cur1);//遍历添加链表1中的元素
            cur1=cur1.next;
        }
        while(cur2!=null){
            if (!hashSet.add(cur2)){//链表2中的元素添加不进去,说明此元素是相交节点
                return cur2;
            }
            cur2=cur2.next;
        }
        return null;
    }

 LeetCode刷题(448,21,83,141,142,160)_第12张图片

 

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        //解法二,遍历长度设置为两条链表长度之和,那么在相交的地方他们就会相等
        ListNode cur1=headA;
        ListNode cur2=headB;
        while (cur1!=cur2){
            cur1=cur1==null?headB:cur1.next;
            cur2=cur2==null?headA:cur2.next;
        }
        return cur1;

    }

LeetCode刷题(448,21,83,141,142,160)_第13张图片

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        //解法三:可以先计算链表的长度,让长的链表先走
        ListNode cur1=headA;
        ListNode cur2=headB;
        int length1=getLength(headA);
        int length2=getLength(headB);
        if (length1>length2){
            for (int i=0;i

 LeetCode刷题(448,21,83,141,142,160)_第14张图片

 

你可能感兴趣的:(leetcode,算法,职场和发展)