力扣labuladong——一刷day14

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • [一、力扣21. 合并两个有序链表](#一、力扣21. 合并两个有序链表)
  • [二、力扣86. 分隔链表](#二、力扣86. 分隔链表)
  • [三、力扣23. 合并 K 个升序链表](#三、力扣23. 合并 K 个升序链表)
  • [四、力扣19. 删除链表的倒数第 N 个结点](#四、力扣19. 删除链表的倒数第 N 个结点)
  • [五、力扣876. 链表的中间结点](#五、力扣876. 链表的中间结点)
  • [六、力扣142. 环形链表 II](#六、力扣142. 环形链表 II)
  • [七、力扣160. 相交链表](#七、力扣160. 相交链表)

前言


一、力扣21. 合并两个有序链表

java 复制代码
/**
 * 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 head = new ListNode(-1,null);
        ListNode p1 = list1, p2 = list2, r = head;
        while(p1 != null && p2 != null){
            if(p1.val <= p2.val){
                r.next = p1;
                p1 = p1.next;
                r = r.next;
            }else{
                r.next = p2;
                p2 = p2.next;
                r = r.next;
            }
        }
        if(p1 != null){
            r.next = p1;
        }
        if(p2 != null){
            r.next = p2;
        }
        return head.next;
    }
}

二、力扣86. 分隔链表

java 复制代码
/**
 * 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 partition(ListNode head, int x) {
        ListNode p1 = new ListNode(), p2 = new ListNode();
        ListNode r1 = p1, r2 = p2, r = head;
        while(r != null){
            if(r.val < x){
                ListNode temp = r;
                r = r.next;
                temp.next = null;
                r1.next = temp;
                r1 = r1.next;
            }else{
                ListNode temp = r;
                r = r.next;
                temp.next = null;
                r2.next = temp;
                r2 = r2.next;
            }
        }
        r1.next = p2.next;
        return p1.next;
    }
}

三、力扣23. 合并 K 个升序链表

java 复制代码
/**
 * 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) {
        ListNode head = new ListNode(), r = head;
        if(lists.length == 0){
            return null;
        }
        PriorityQueue<ListNode> pq = new PriorityQueue<>((a,b)->{
            return a.val - b.val;
        });
        for(ListNode node : lists){
            if(node != null){
                pq.add(node);
            }
        }
        while(! pq.isEmpty()){
            ListNode cur = pq.poll();
            r.next = cur;
            cur = cur.next;
            r = r.next;
            if(cur != null){
                pq.add(cur);
            }
        }
        return head.next;
    }
}

四、力扣19. 删除链表的倒数第 N 个结点

java 复制代码
/**
 * 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 removeNthFromEnd(ListNode head, int n) {
        ListNode res = new ListNode(-1,head);
        ListNode r1 = res, r2 = res;
        int len = 0;
        while(len < n+1){
            r1 = r1.next;
            len ++;
        }
        while(r1 != null){
            r1 = r1.next;
            r2 = r2.next;
        }
        r2.next = r2.next.next;
        return res.next;
    }
}

五、力扣876. 链表的中间结点

java 复制代码
/**
 * 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 middleNode(ListNode head) {
        ListNode p1 = head, p2 = head;
        while(p2 != null && p2.next != null){
            p2 = p2.next;
            p1 = p1.next;
            if(p2 != null){
                p2 = p2.next;
            }else{
                break;
            }
        }
        return p1;
    }
}

六、力扣142. 环形链表 II

java 复制代码
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        if(head == null)return null;
        ListNode fast = head, slow = fast;
        while(fast != null){
            slow = slow.next;
            fast = fast.next;
            if(fast == null){
                return null;
            }else{
                fast = fast.next;
                if(fast == slow){
                    slow = head;
                    while(slow != fast){
                        slow = slow.next;
                        fast = fast.next;
                    }
                    return fast;
                }
            }
        }
        return null;
    }
}

七、力扣160. 相交链表

java 复制代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode p1 = headA, p2 = headB;
        ListNode max, min;
        int lenA = 0, lenB = 0, edge = 0;
        while(p1 != null){
            lenA ++;
            p1 = p1.next;
        }
        while(p2 != null){
            lenB ++;
            p2 = p2.next;
        }
        if(lenA > lenB){
            edge = lenA - lenB;
            max = headA;
            min = headB;
        }else{
            edge = lenB - lenA;
            max = headB;
            min = headA;
        }
        while(edge > 0){
            edge --;
            max = max.next;    
        }
        while(max != null && min != null){
            if(max == min){
                return max;
            }
            max = max.next;
            min = min.next;
        }
        return null;
    }
}
相关推荐
爱数模的小驴1 小时前
2025 年“认证杯”数学中国数学建模网络挑战赛 C题 化工厂生产流程的预测和控制
深度学习·算法·计算机视觉
Hanson Huang2 小时前
【数据结构】堆排序详细图解
java·数据结构·排序算法·堆排序
Susea&2 小时前
数据结构初阶:队列
c语言·开发语言·数据结构
路在脚下@2 小时前
Redis实现分布式定时任务
java·redis
xrkhy2 小时前
idea的快捷键使用以及相关设置
java·ide·intellij-idea
巨龙之路2 小时前
Lua中的元表
java·开发语言·lua
序属秋秋秋3 小时前
算法基础_数据结构【单链表 + 双链表 + 栈 + 队列 + 单调栈 + 单调队列】
c语言·数据结构·c++·算法
花花鱼3 小时前
itext7 html2pdf 将html文本转为pdf
java·pdf
小丁爱养花4 小时前
驾驭 Linux 云: JavaWeb 项目安全部署
java·linux·运维·服务器·spring boot·后端·spring
apcipot_rain4 小时前
【密码学——基础理论与应用】李子臣编著 第五章 序列密码 课后习题
算法·密码学