【LeetCode】刷题记录--单链表相关

21

java 复制代码
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        if (list1 == null) return list2;
        if (list2 == null) return list1;
        ListNode result = new ListNode(0);
        ListNode p = result;
        while (list1 != null && list2 != null){
            if (list1.val < list2.val){
                p.next = list1;
                list1 = list1.next;
            }else {
                p.next = list2;
                list2 = list2.next;

            }
            p = p.next;
        }
        if (list1 != null) p.next = list1;
        if (list2 != null) p.next = list2;
        return result.next;
    }

83

java 复制代码
public ListNode deleteDuplicates(ListNode head) {
        if (head == null) return head;
        ListNode result = head;
        while (result.next != null){
            if (result.val == result.next.val){
                result.next = result.next.next;
            }else {
                result = result.next;
            }
        }
        return head;
    }

141

java 复制代码
public boolean hasCycle(ListNode head) {
//        if (head == null) return false;
//        HashMap<ListNode,Integer> linkListMap = new HashMap<ListNode, Integer>();
//        while (head.next != null){
//            if (linkListMap.get(head) == null){
//                linkListMap.put(head,head.val);
//            }else return true;
//            head = head.next;
//        }
//        return false;
        //-----------------------------------------------
        if (head == null) return false;
        ListNode fastPtr = head,slowPtr = head;
        while (fastPtr.next != null && fastPtr.next.next != null){
            fastPtr = fastPtr.next.next;
            slowPtr = slowPtr.next;


            if (fastPtr == slowPtr) return true;


        }
        return false;
        
    }

142

java 复制代码
public ListNode detectCycle(ListNode head) {
        if (head == null) return null;
        boolean test = false;
        ListNode fast = head,slow = head;
        while (fast.next != null && fast.next.next != null){
            fast = fast.next.next;
            slow = slow.next;
            if (slow == fast) {
                test = true;
                break;
            }
        }

        if (test){
            slow = head;
            while (slow != fast){
                slow = slow.next;
                fast = fast.next;
            }
            return slow;
        }
        return null;
    }

160

java 复制代码
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        int L1=0,L2=0;
        ListNode la = headA,lb = headB;
        while (la != null){
            L1++;
            la = la.next;
        }
        while (lb != null){
            L2++;
            lb = lb.next;
        }
        if ((L1 - L2)>0){
            //a比b长
            for (int i = 0; i < (L1 - L2); i++) headA = headA.next;
            while (headA != headB) {
                headA = headA.next;
                headB = headB.next;
            }
            return headA;
        }else {
            //b比a长或相等
            for (int i = 0; i < (L2 - L1); i++) headB = headB.next;
            while (headB != headA){
                headA = headA.next;
                headB = headB.next;
            }
            return headA;
        }
    }

206 反转列表

java 复制代码
public ListNode reverseList(ListNode head) {
        ListNode currNode = head;
        ListNode preNode = null;
        while (currNode != null){
            ListNode next = currNode.next;
            currNode.next = preNode;
            preNode = currNode;
            currNode = next;
        }
        return preNode;
    }

234回文链表

java 复制代码
public boolean isPalindrome(ListNode head) {
        if (head == null) return false;
        ListNode fast = head,slow = head;
        while (fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
        }
        if (fast != null){
            slow = slow.next;
        }
        slow = reverse(slow);
        fast = head;
        while (slow != null){
            if (fast.val != slow.val) return false;
            fast = fast.next;
            slow = slow.next;
        }
        return true;
}
public ListNode reverse(ListNode head){
        ListNode preNode = null;
        while (head != null){
            ListNode next = head.next;
            head.next = preNode;
            preNode = head;
            head = next;
        }
        return preNode;
    }

876链表的中间节点

java 复制代码
public ListNode middleNode(ListNode head) {
        ListNode fast = head,slow = head;
        while (fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
        }
        return slow;//双指针

    }
相关推荐
AI软著研究员5 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish5 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱6 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者1 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮1 天前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者1 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考1 天前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx1 天前
CART决策树基本原理
算法·机器学习
Wect1 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱1 天前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法