力扣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;
    }
}
相关推荐
椰羊~王小美6 分钟前
setScale没传roudingmode,为什么会报错
java
WizLC13 分钟前
【JAVA】JVM类加载器知识笔记
java·jvm·笔记
喝汽水的猫^15 分钟前
Java实现Excel 导出(多 Sheet、复杂格式)
java·excel
自然常数e17 分钟前
深入理解指针(6)
c语言·数据结构·算法·visual studio
Xの哲學17 分钟前
Linux VxLAN深度解析: 从数据平面到内核实现的全面剖析
linux·服务器·算法·架构·边缘计算
TL滕20 分钟前
从0开始学算法——第十八天(分治算法练习)
笔记·学习·算法
一杯美式 no sugar24 分钟前
数据结构——栈
c语言·数据结构·
毕设源码-朱学姐26 分钟前
【开题答辩全过程】以 基于JavaWeb的疾病查询系统的设计与实现为例,包含答辩的问题和答案
java·eclipse
雨中飘荡的记忆29 分钟前
Java面向对象编程详解
java·开发语言
月明长歌33 分钟前
【码道初阶】【LeetCode 958】判定完全二叉树:警惕 BFS 中的“管中窥豹”陷阱
算法·leetcode·宽度优先