<03.05>Leetcode

发布于:2025-03-06 ⋅ 阅读:(15) ⋅ 点赞:(0)

 

/**
 * 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 sortList(ListNode head) {

        //Cut阶段 将数组分隔开
        if(head == null || head.next == null)return head;//终止条件:说明只有一个节点了 直接返回此节点
        ListNode fast = head.next;//奇数的话找到中间点 偶数的话找到中间偏左点
        ListNode slow = head;
        while(fast != null && fast.next != null){//快的走两步慢的走一步
            slow = slow.next;
            fast = fast.next.next;
        }
        ListNode tmp = slow.next;//找到链表的中点
        slow.next = null;//将链表切断
        ListNode left = sortList(head);//左端点(其实是一个数组的左端点)
        ListNode right = sortList(tmp);//右端点(其实是另一个数组的左端点)

        //Merge阶段 将零散的子数组合并成有顺序的数组
        //设置两指针 left, right 分别指向两链表头部,比较两指针处节点值大小,由小到大加入合并链表头部,指针
        //交替前进,直至添加完两个链表。
        ListNode h = new ListNode(0);
        ListNode res = h;
        while(left != null && right != null){
            if(left.val<right.val){
                h.next = left;
                left = left.next;
            }else{
                h.next = right;
                right = right.next;
            }
            h = h.next;//数组自行向后
        }
        h.next = (left!=null?left:right);//将数组接上
        return res.next;
    }
}

 

 

/**
 * 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) {//存储的是各个链表的头节点
        PriorityQueue<ListNode> pq = new PriorityQueue<>((a,b) -> a.val - b.val);//升序
        for(ListNode head:lists){
            if(head != null){
                pq.offer(head);
            }
        }
        ListNode dummy = new ListNode();//哨兵节点 作为合并后链表头节点的前一个节点
        ListNode cur = dummy;
        while(!pq.isEmpty()){//循环直到空
            ListNode node = pq.poll();//剩余节点中最小节点
            if(node.next != null){ //下一个节点不为空
                pq.offer(node.next);//下一个节点有可能是最小节点 
            }
            cur.next = node;//合并到新链表之中
            cur = cur.next;
        }
        return dummy.next;
    }
}

 


/**
 * //调用父类HashMap的构造方法。
 * Constructs an empty insertion-ordered <tt>LinkedHashMap</tt> instance
 * with the default initial capacity (16) and load factor (0.75).
 */
public LinkedHashMap() {
    super();
    accessOrder = false;
}
// 这里的 accessOrder 默认是为false,如果要按读取顺序排序需要将其设为 true
// initialCapacity 代表 map 的 容量,loadFactor 代表加载因子 (默认即可)
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) {
    super(initialCapacity, loadFactor);
    this.accessOrder = accessOrder;
}

作者:jeromememory
链接:https://leetcode.cn/problems/lru-cache/solutions/81045/yuan-yu-linkedhashmapyuan-ma-by-jeromememory/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

public class LRUCache {
    class DLinkedNode {
        int key;
        int value;
        DLinkedNode prev;
        DLinkedNode next;
        public DLinkedNode() {}
        public DLinkedNode(int _key, int _value) {key = _key; value = _value;}
    }

    private Map<Integer, DLinkedNode> cache = new HashMap<Integer, DLinkedNode>();
    private int size;
    private int capacity;
    private DLinkedNode head, tail;

    public LRUCache(int capacity) {
        this.size = 0;
        this.capacity = capacity;
        // 使用伪头部和伪尾部节点
        head = new DLinkedNode();
        tail = new DLinkedNode();
        head.next = tail;
        tail.prev = head;
    }

    public int get(int key) {
        DLinkedNode node = cache.get(key);
        if (node == null) {
            return -1;
        }
        // 如果 key 存在,先通过哈希表定位,再移到头部
        moveToHead(node);
        return node.value;
    }

    public void put(int key, int value) {
        DLinkedNode node = cache.get(key);
        if (node == null) {
            // 如果 key 不存在,创建一个新的节点
            DLinkedNode newNode = new DLinkedNode(key, value);
            // 添加进哈希表
            cache.put(key, newNode);
            // 添加至双向链表的头部
            addToHead(newNode);
            ++size;
            if (size > capacity) {
                // 如果超出容量,删除双向链表的尾部节点
                DLinkedNode tail = removeTail();
                // 删除哈希表中对应的项
                cache.remove(tail.key);
                --size;
            }
        }
        else {
            // 如果 key 存在,先通过哈希表定位,再修改 value,并移到头部
            node.value = value;
            moveToHead(node);
        }
    }

    private void addToHead(DLinkedNode node) {
        node.prev = head;//假头
        node.next = head.next;
        head.next.prev = node;
        head.next = node;
    }

    private void removeNode(DLinkedNode node) {
        node.prev.next = node.next;
        node.next.prev = node.prev;
    }

    private void moveToHead(DLinkedNode node) {
        removeNode(node);
        addToHead(node);
    }

    private DLinkedNode removeTail() {
        DLinkedNode res = tail.prev;//假尾前面的
        removeNode(res);
        return res;
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到