首页 > 其他分享 >LeetCodeHot100 链表 160. 相交链表 206. 反转链表 234. 回文链表 141. 环形链表 142. 环形链表 II 21. 合并两个有序链表 2. 两数相加 1

LeetCodeHot100 链表 160. 相交链表 206. 反转链表 234. 回文链表 141. 环形链表 142. 环形链表 II 21. 合并两个有序链表 2. 两数相加 1

时间:2024-03-27 13:24:25浏览次数:16  
标签:head ListNode 环形 next 链表 234 return null

160. 相交链表
https://leetcode.cn/problems/intersection-of-two-linked-lists/description/?envType=study-plan-v2&envId=top-100-liked

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        int lenA = 0;
        int lenB = 0;
        ListNode p = headA;
        while (p != null){
            lenA++;
            p = p.next;
        }
        p = headB;
        while (p != null){
            lenB++;
            p = p.next;
        }
        if (lenA > lenB){
            for (int i = 0; i < lenA - lenB; i++) {
                headA = headA.next;
            }
        }else if (lenA < lenB){
            for (int i = 0; i < lenB - lenA; i++) {
                headB = headB.next;
            }
        }
        while (headA != null){
            if (headA == headB){
                break;
            }else {
                headA = headA.next;
                headB = headB.next;
            }
        }
        return headA;
    }

总结:关键点就是消除长度差
206. 反转链表
https://leetcode.cn/problems/reverse-linked-list/description/?envType=study-plan-v2&envId=top-100-liked

public ListNode reverseList(ListNode head) {
        ListNode cur = head;
        ListNode pre = null;
        while (cur != null){
            ListNode temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }

总结:三指针,每次两个指针cur指向pre 就完成了反转。
234. 回文链表
https://leetcode.cn/problems/palindrome-linked-list/description/?envType=study-plan-v2&envId=top-100-liked

public boolean isPalindrome(ListNode head) {
        Deque<ListNode> stack = new ArrayDeque<>();
        ListNode node = head;
        while (node != null){
            stack.addLast(node);
            node = node.next;
        }
        while (head != null){
            ListNode node1 = stack.pollLast();
            if (head.val == node1.val){
                head = head.next;
            }else {
                return false;
            }
        }
        return true;
    }

总结:用栈很方便,也可以快慢指针,快的一次两个格,慢的一次一格,去找中点,再反转后半段,再去比较。
141. 环形链表
https://leetcode.cn/problems/linked-list-cycle/description/?envType=study-plan-v2&envId=top-100-liked

public boolean hasCycle(ListNode head) {
        if (head == null || head.next == null) {
            return false;
        }
        ListNode slow = head;
        ListNode fast = head.next;
        while (slow != fast){
            if (fast == null || fast.next == null) return false;
            slow = slow.next;
            fast = fast.next.next;
        }
        return true;
    }

总结:快慢指针,快的走两个格,慢的走一个格,如果有环,则一定fast和slow能够碰上。
142. 环形链表 II
https://leetcode.cn/problems/linked-list-cycle-ii/description/?envType=study-plan-v2&envId=top-100-liked

public ListNode detectCycle(ListNode head) {
        HashSet<ListNode> set = new HashSet<>();
        while (head != null){
            if (set.contains(head)) return head;
            set.add(head);
            head = head.next;
        }
        return head;
    }

总结:hash
21. 合并两个有序链表
https://leetcode.cn/problems/merge-two-sorted-lists/description/?envType=study-plan-v2&envId=top-100-liked

public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        if (list1 == null){
            return list2;
        }
        if (list2 == null){
            return list1;
        }
        if (list1.val < list2.val){
            list1.next = mergeTwoLists(list1.next,list2);
            return list1;
        }else {
            list2.next = mergeTwoLists(list1,list2.next);
            return list2;
        }
    }

总结:合并两个链表用递归很方便
2. 两数相加
https://leetcode.cn/problems/add-two-numbers/description/?envType=study-plan-v2&envId=top-100-liked

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode pre = new ListNode();
        ListNode cur = pre;
        int flag = 0;
        while (l1 != null || l2 != null){
            int x = l1 == null ? 0 : l1.val;
            int y = l2 == null ? 0 : l2.val;
            int sum = x + y + flag;
            flag = sum / 10;
            int newSum = sum % 10 ;
            cur.next = new ListNode(newSum);
            cur = cur.next;
            if(l1 != null)
                l1 = l1.next;
            if(l2 != null)
                l2 = l2.next;
        }
        if (flag == 1){
            cur.next = new ListNode(1);
        }
        return pre.next;
    }

总结:每次同时遍历两个链表,取值,有空的就认为是0, 每次构造的新节点的值是 取的两个值+flag 再余10,记得每次更新flag,添加的是newSum。
19. 删除链表的倒数第 N 个结点
https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/?envType=study-plan-v2&envId=top-100-liked

public ListNode removeNthFromEnd(ListNode head, int n) {
        if (head == null) return head;
        int len = 0;
        ListNode p = head;
        while (p != null){
            len++;
            p = p.next;
        }
        ListNode realHead  = new ListNode(0,head);
        ListNode pre = realHead;
        for (int i = 0; i < len - n; i++) {
            pre = pre.next;
        }
        pre.next = pre.next.next;
        return realHead.next;
    }

总结:关键点就在于构建虚拟头结点
24. 两两交换链表中的节点
https://leetcode.cn/problems/swap-nodes-in-pairs/description/?envType=study-plan-v2&envId=top-100-liked

public ListNode swapPairs(ListNode head) {
        if (head == null) return head;
        ListNode newHead = new ListNode(0,head);
        ListNode pre = newHead;
        ListNode node1 = newHead.next;
        ListNode node2 = newHead.next.next;
        while (node1 != null && node2 != null){
            ListNode temp = node2.next;
            pre.next = node2;
            node2.next = node1;
            node1.next = temp;
            pre = node1;
            node1 = temp;
            node2 = temp == null ? null : temp.next;
        }
        return newHead.next;
    }

总结:注意细节
25. K 个一组翻转链表
https://leetcode.cn/problems/reverse-nodes-in-k-group/description/?envType=study-plan-v2&envId=top-100-liked

public ListNode reverseKGroup(ListNode head, int k) {
        ListNode hair = new ListNode(0);
        hair.next = head;
        ListNode pre = hair;

        while (head != null) {
            ListNode tail = pre;
            // 查看剩余部分长度是否大于等于 k
            for (int i = 0; i < k; ++i) {
                tail = tail.next;
                if (tail == null) {
                    return hair.next;
                }
            }
            ListNode nex = tail.next;
            ListNode[] reverse = myReverse(head, tail);
            head = reverse[0];
            tail = reverse[1];
            // 把子链表重新接回原链表
            pre.next = head;
            tail.next = nex;
            pre = tail;
            head = tail.next;
        }

        return hair.next;
    }

    public ListNode[] myReverse(ListNode head, ListNode tail) {
        ListNode prev = tail.next;
        ListNode p = head;
        while (prev != tail) {
            ListNode nex = p.next;
            p.next = prev;
            prev = p;
            p = nex;
        }
        return new ListNode[]{tail, head};
    }

总结:就是看翻转的范围,去遍历

标签:head,ListNode,环形,next,链表,234,return,null
From: https://www.cnblogs.com/jeasonGo/p/18098758

相关文章

  • leetcode:链表的中间节点
    快慢指针快的到了末尾,慢的所指的就是中点你一开始写的时候while里面,fast.next放在前面,报错,空指针应该写在后面,对于偶数个元素的链表而言/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode......
  • 每日一练:LeeCode-234、回文链表【链表+栈+快慢双指针】
    给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。示例1:输入:head=[1,2,2,1]输出:true示例2:输入:head=[1,2]输出:false提示:链表中节点数目在范围[1,10^5]内0<=Node.val<=9进阶:你能否用O(n)时间复杂度......
  • 【数据结构】C语言单链表的实现
    有时我们不用顺序表,而使用链表,是因为顺序表存在一定的问题1、顺序表的中间/头部的插入、删除需要挪动数据2、扩容需要申请新空间,拷贝数据,释放旧空间,存在性能的消耗3、会有空间的浪费单链表:不带头单向循环链表双链表:带头双向循环链表单链表的具体实现:1、单链表的创建:2......
  • 力扣刷题之21.合并两个有序链表
    仅做学习笔记之用。题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例3:输入:l1=[],l2=[0]输出:[0]......
  • Leetcode 反转链表
    Day10刷题#######力扣官方解答:用节点作为交换方式,而非其中的值,通过增加一个空null,来使得指向完全相反。#######迭代法:classSolution{publicListNodereverseList(ListNodehead){ListNodeprev=null;ListNodecurr=head;while(cur......
  • 代码随想录第四天 链表Part02
    语言:Java参考资料:代码随想录、ChatGPT3.524.两两交换链表中的节点力扣题目链接(opensnewwindow)给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。思路这道题目正常模拟就可以了。建议......
  • 【每日算法】理论:AIGC模型 刷题:力扣链表操作
    上期文章【每日算法】理论:图像分割相关刷题:设计链表文章目录上期文章一、上期问题二、理论问题1、LAMAInpaint2、IPadapter模型3、Anydoor4、vit(VisionTransformer)架构5、MAE6、CLIP模型三、力扣刷题回顾-链表操作203.移除链表元素206.反转链表24.两两交换链表......
  • 实现双向链表
    1classNode{2intdata;3Nodenext;4Node(intdata){5this.data=data;6}7}8publicclassMyNodes{9privateNodehead;10privateNodelast;11privateintsize;12publicNodeget(intindex){13......
  • 速通数据结构第三站 单链表
    系列文章目录速通数据结构与算法系列1  速通数据结构与算法第一站复杂度          http://t.csdnimg.cn/sxEGF2  速通数据结构与算法第二站顺序表 3 速通数据结构与算法第二站单链表 感谢佬们支持!目录系列文章目录前言一、单链表   ......
  • L2-022 重排链表(25分) c++代码
    给定一个单链表 L1​→L2​→⋯→Ln−1​→Ln​,请编写程序将链表重新排列为 Ln​→L1​→Ln−1​→L2​→⋯。例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3。输入格式:每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址和结点总个数,即正整数N (......