小工具知识网

当前位置: 首页 > 行业知识 > 力扣爆刷第89天之hot100五连刷31-35

行业知识

力扣爆刷第89天之hot100五连刷31-35

2026-11-12 19:30:52 来源:互联网转载

力扣爆刷第89天之hot100五连刷31-35

文章目录

      • 力扣爆刷第89天之hot100五连刷31-35
      • 一、25. K 个一组翻转链表
      • 二、138. 随机链表的复制
      • 三、148. 排序链表
      • 四、23. 合并 K 个升序链表
      • 五、146. LRU ���存

        一、25. K 个一组翻转链表

        题目链接:https://leetcode.cn/problems/reverse-nodes-in-k-group/description/?envType=study-plan-v2&envId=top-100-liked

        ()

        思路:k个一组翻转,写好一个单独的翻转方法,然后外部控制好每次翻转的头和尾。

        class Solution {    public ListNode reverseKGroup(ListNode head, int k) {        ListNode root = new ListNode(-1, head);        ListNode p = root, fast = head;        int i = 0;        while(fast != null) {            i++;            fast = fast.next;            if(i % k == 0) {                p = reverse(p, fast);            }        }        return root.next;    }    ListNode reverse(ListNode start, ListNode end) {        ListNode p1 = start, p2 = start.next, p3 = p2;        start.next = null;        while(p2 != end) {            ListNode t = p2.next;            p2.next = p1.next;            p1.next = p2;            p2 = t;        }        p3.next = end;        return p3;    }   }

        二、138. 随机链表的复制

        题目链接:https://leetcode.cn/problems/copy-list-with-random-pointer/description/?envType=study-plan-v2&envId=top-100-liked

        ()

        思路:使用map做一个映射记录,key为旧节点,value为新节点,然后遍历复制新链表,random值也复制过去,然后再遍历一遍新链表,

        根据key去找value,即可。

        class Solution {    public Node copyRandomList(Node head) {        // key-旧节点 value-新节点        Map map = new HashMap();        Node root = new Node(-1);        Node p1 = head, p2 = root;        while(p1 != null) {            Node n = new Node(p1.val);            n.random = p1.random;            map.put(p1, n);            p2.next = n;            p2 = n;            p1 = p1.next;        }        p2 = root.next;        while(p2 != null) {            if(p2.random != null) {                p2.random = map.get(p2.random);            }            p2 = p2.next;        }        return root.next;    }}

        三、148. 排序链表

        题目链接:https://leetcode.cn/problems/sort-list/description/?envType=study-plan-v2&envId=top-100-liked

        思路:采用归并排序,递归划分链表,直到划分到单个元素,然后再排序。

        class Solution {    public ListNode sortList(ListNode head) {        return sortList(head, null);    }    public ListNode sortList(ListNode head, ListNode tail) {        if (head == null) {            return head;        }        if (head.next == tail) {            head.next = null;            return head;        }        ListNode slow = head, fast = head;        while (fast != tail) {            slow = slow.next;            fast = fast.next;            if (fast != tail) {                fast = fast.next;            }        }        ListNode mid = slow;        ListNode list1 = sortList(head, mid);        ListNode list2 = sortList(mid, tail);        ListNode sorted = merge(list1, list2);        return sorted;    }    public ListNode merge(ListNode head1, ListNode head2) {        ListNode dummyHead = new ListNode(0);        ListNode temp = dummyHead, temp1 = head1, temp2 = head2;        while (temp1 != null && temp2 != null) {            if (temp1.val                 temp.next = temp1;                temp1 = temp1.next;            } else {                temp.next = temp2;                temp2 = temp2.next;            }            temp = temp.next;        }        if (temp1 != null) {            temp.next = temp1;        } else if (temp2 != null) {            temp.next = temp2;        }        return dummyHead.next;    }}public ListNode mergeKLists(ListNode[] lists) {        if(lists.length == 0) return null;        PriorityQueue a.val - b.val);        for(ListNode list : lists) {            if(list != null) {                queue.add(list);            }        }        ListNode root = new ListNode();        ListNode p = root;        while(!queue.isEmpty()) {            ListNode min = queue.poll();            p.next = min;            p = min;            if(min.next != null) {                queue.add(min.next);            }        }        return root.next;    }}

        五、146. LRU 缓存

        题目链接:https://leetcode.cn/problems/lru-cache/description/?envType=study-plan-v2&envId=top-100-liked

        思路:最近最少使用,get或put都会是得该元素优先级最高,容量满了就要把最久未使用的给去掉,那么可以利用LinkedHashMap的特性,底层采用哈希表和双向链表,put方法加入的元素永远在链表的最后,最先添加进来的在头结点,所以可以使用Integer first = map.keySet().iterator().next();获取头结点然后把头结点给去掉。

        class LRUCache {    LinkedHashMap map;    int cap = 0;    public LRUCache(int capacity) {        map = new LinkedHashMap();        cap = capacity;    }    public int get(int key) {        if (!map.containsKey(key)) {            return -1;        }        Integer val = map.remove(key);        map.put(key, val);        return val;    }    public void put(int key, int value) {        if (map.containsKey(key)) {            map.remove(key);            map.put(key, value);            return;        }        if (cap             Integer first = map.keySet().iterator().next();            map.remove(first);        }        map.put(key, value);    }}

上一篇:视频号服务器怎么申请的?

下一篇:服务器转换代码怎么显示?