首页 > 其他分享 >925打卡

925打卡

时间:2023-09-25 14:34:51浏览次数:43  
标签:ListNode cur val list1 next 打卡 null 925

1. 合并两个有序链表(21)

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

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
    ListNode res = new ListNode(0);
        ListNode cur = res;
        while (list1!=null || list2!=null){
            if ( list1 ==null ){
                while (list2!=null){
                cur.next=new ListNode(list2.val);
                    list2=list2.next;
                    cur = cur.next;}
                
            }
            if ( list2 ==null ){
                while (list1!=null){
                    cur.next=new ListNode(list1.val);
                    list1=list1.next;
                    cur = cur.next;}
            }

            if(list1!=null && list2!=null){
                if (list1.val<=list2.val){
                    cur.next =new ListNode(list1.val);
                    list1=list1.next;
                    cur = cur.next;
                }else {
                    cur.next = new ListNode(list2.val);
                    list2=list2.next;
                    cur = cur.next;
                }
            }
        }
        return  res.next;
    
    }
}

2. 生成有效的括号(22)

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

class Solution {
    public List<String> generateParenthesis(int n) {
   ArrayList<String> res = new ArrayList<>();
        if (n==0)
            return res;
        dfs("",n,n,res);
        return res;
    }

    /**
     *
     * @param s
     * @param left  左括号可用数量
     * @param right 右括号可用数量
     * @param res
     */
    private void dfs(String s, int left, int right, ArrayList<String> res) {
        //当前左右括号都有大于 0 个可以使用的时候,才产生分支
        if(left ==0 && right==0){
            res.add(s); //在左边和右边剩余的括号数都等于 0的时候结算
            return;
        }
        //产生右分支的时候,还受到左分支的限制,右边剩余可以使用的括号数量一定得在严格大于左边剩余的数量的时候,才可以产生分支;
        if(left>right){
            return;
        }
        //产生左分支的时候,只看当前是否还有左括号可以使用
        if(left>0){
            dfs(s+"(",left-1,right,res);
        }
        if(right>0){
            dfs(s+")",left,right-1,res);
        }


    }
}

3. 合并k个升序链表(23)

给你一个链表数组,每个链表都已经按升序排列。

思想: 分治+ 合并

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
   return merge(lists, 0, lists.length - 1);
    }

    private ListNode merge(ListNode[] lists, int left, int right) {
        if (left == right)
            return lists[left];
        if (left > right) {
            return null;
        }
        int mid = (left + right) >> 1;
        return merge2Lists(merge(lists, left, mid), merge(lists, mid + 1, right));
    }

    public ListNode merge2Lists(ListNode list1, ListNode list2) {
        if (list1 == null || list2 == null)
            return list1 == null ? list2 : list1;

        ListNode res = new ListNode(0);
        ListNode cur = res;
        while (list1 != null && list2 != null) {
            if (list1.val < list2.val) {
                cur.next = new ListNode(list1.val);
                list1 = list1.next;
            } else {
                cur.next = new ListNode(list2.val);
                list2 = list2.next;
            }
            cur = cur.next;
        }
        cur.next = (list1 == null) ? list2 : list1;
        return res.next;
    }
}

4. 两两交换链表节点(24)

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

思想: 迭代,两两交换,需要保存上一节点

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
              ListNode cur = head;
        ListNode pre = new ListNode(0);
        ListNode pres=pre;
        if(head==null || head.next ==null)
            return head;

        while (cur!=null&& cur.next !=null){
            ListNode temp = cur.next;
            cur.next = temp.next;
            temp.next = cur;
            pre.next = temp;
            cur = cur.next;
            pre = pre.next.next;
        }
        return pres.next;
    }
}

5. k个一组翻转(25)

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表

思想: 反转

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
   ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode pre = dummy;
        ListNode end = dummy;

        while (end.next != null) {
            for (int i = 0; i < k && end != null; i++) {
                end = end.next;
            }
            if (end == null) break;
            ListNode start = pre.next;
            ListNode next = end.next;
            end.next = null;
            pre.next = reverse(start);
            start.next = next;
            pre = start;
            end = pre;
        }
      return dummy.next;

    }

    private ListNode reverse(ListNode head) {
        ListNode res = null;
        ListNode cur = head;
        while (cur != null) {
            ListNode next = cur.next;
            cur.next = res;
            res = cur;
            cur = next;
        }
        return res;
    }
}

 

标签:ListNode,cur,val,list1,next,打卡,null,925
From: https://www.cnblogs.com/forever-fate/p/17727868.html

相关文章

  • 20230925 模拟赛总结
    模拟赛连接排名:\(\text{rank1}\)分数:\(100+100+100+100=400\)集训期间第二次AK!T1:灭火/fire题目描述:求出\(n\)个数\(a_1,a_2,\dots,a_n\)的和除以\(m\)向上取整的结果。(\(0<a_i,m<2^{63},0<n\le20\))思路:直接求和,然后向上取整即可,注意要用高精度,我用的是__int128......
  • ARTS打卡---第四周
    原本应该为第六周,中间两周在各种原因未打卡(需反省)Algorithm力扣中等题:https://leetcode.cn/problems/product-of-array-except-self/description/解题思路:一次遍历,由于不能用除法,因而需要按正序和逆序输出前缀积,再得出每个位置除自身的积。Review完成部件,Android的启动流程学......
  • 9月24每日打卡
    极限测试这次测试的流程主要分为五个步骤。1、数据导入2、数据清洗3、数据分析处理4、Sqoop导入Hive数据到MySQL5、通过javaweb+echarts进行数据可视化下面是我做的具体流程代码。......
  • 算法打卡|Day4 链表part02
    Day4链表part02今日任务●24.两两交换链表中的节点●19.删除链表的倒数第N个节点●面试题02.07.链表相交●142.环形链表II[TOC]Problem:24.两两交换链表中的节点思路1.迭代法就要注意画图!画图!还是画图!另外迭代的次序不要忘记,链表迭代统一从左往右迭代。用三......
  • 算法打卡|Day3 链表part01
    Day3链表part01今日任务●链表理论基础●203.移除链表元素●707.设计链表●206.反转链表[TOC]链表理论基础文章链接:https://programmercarl.com/%E9%93%BE%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html重点:单链表是一种通过指针串联在一起的线性结构,每一......
  • 923打卡
    1.三数之和(15)给你一个整数数组 nums ,判断是否存在三元组 [nums[i],nums[j],nums[k]] 满足 i!=j、i!=k 且 j!=k ,同时还满足 nums[i]+nums[j]+nums[k]==0 。请你返回所有和为 0 且不重复的三元组。classSolution{publicList<List<Integer>>......
  • 打卡
    9月22日:今天上午上了形势与政策课程,下午我们学习了高级英语,通过两节课的学习,我有从中学习了单词与语法,与此同时今天我也将java课的课后作业完成。明天做数据结构与算法的课后习题,然后抽时间学习一下java。......
  • 每日打卡 周五 九月二十二日
    今天又上英语课,快要四级考试了,得抓紧学习英语,下午完课后,看了一会儿英语单词,主要是翻译有问题,以前没有做过的题型也会一直是难,主要是想不词语的意思可以那样用。其实主要功课就是背单词,现在词汇积累的少,出现都不认识,在着就是听听力,真的是要很好的训练了。......
  • 922打卡
    1.盛最多水的容器(11)给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i,0) 和 (i,height[i]) 思想:双指针classSolution{publicintmaxArea(int[]height){intleft=0;intright=height.length-1;i......
  • 算法打卡|Day2 数组part02
    Day2数组part02今日任务:977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II目录Day2数组part02今日任务:977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵IIProblem:977.有序数组的平方思路解题方法复杂度CodeProblem:209.长度最小的子数组思路解题方法复杂......