力扣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;
    }
}
相关推荐
IT毕设梦工厂9 分钟前
计算机毕业设计选题推荐-在线拍卖系统-Java/Python项目实战
java·spring boot·python·django·毕业设计·源码·课程设计
luthane36 分钟前
python 实现average mean平均数算法
开发语言·python·算法
静心问道40 分钟前
WGAN算法
深度学习·算法·机器学习
Ylucius43 分钟前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
七夜zippoe1 小时前
分布式系统实战经验
java·分布式
杰九1 小时前
【算法题】46. 全排列-力扣(LeetCode)
算法·leetcode·深度优先·剪枝
manba_1 小时前
leetcode-560. 和为 K 的子数组
数据结构·算法·leetcode
liuyang-neu1 小时前
力扣 11.盛最多水的容器
算法·leetcode·职场和发展
是梦终空1 小时前
JAVA毕业设计176—基于Java+Springboot+vue3的交通旅游订票管理系统(源代码+数据库)
java·spring boot·vue·毕业设计·课程设计·源代码·交通订票
忍界英雄1 小时前
LeetCode:2398. 预算内的最多机器人数目 双指针+单调队列,时间复杂度O(n)
算法·leetcode·机器人