LeetCode 24. 两两交换链表中的节点 19. 删除链表的倒数第 N 个结点 面试题 02.07. 链表相交 142. 环形链表 II

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


24. 两两交换链表中的节点


● 今日学习的Leetcode链接

两两交换链表中的节点

● 自己看到题目的第一想法

加一个头结点,两两交换

● 看完代码随想录之后的想法

一样

● 自己实现过程中遇到哪些困难

  1. 结束条件怎么写
  2. 假头结点是为了第一次交换方便
  3. 另一个新建的结点才是交换的关键

● 今日收获,记录一下自己的学习时长

思路都是对的,但是交换时有个细节错了,导致一直循环,对比了半天才找出来

 public ListNode swapPairs(ListNode head) {
        ListNode dummyHead  = new ListNode(0);
        dummyHead.next = head;

        ListNode temp  = dummyHead ;
       

        while(temp.next!=null && temp.next.next!=null){
            ListNode node1  = temp .next;
            ListNode node2= temp.next.next;
            temp.next = node2;
            node1.next = node2.next;
            node2.next = node1 ;
            temp  = node1 ;
            
        }

        return dummyHead .next;
    }

19. 删除链表的倒数第 N 个结点


● 今日学习的Leetcode链接

删除链表的倒数第 N 个结点

● 自己看到题目的第一想法

双指针,快指针移动一定次后,快慢指针一起移动

● 看完代码随想录之后的想法

解决方法很多
快慢指针它多加了一个假头结点,方便操作

● 自己实现过程中遇到哪些困难

没有加头结点,而且没有判断一种情况,当删除的正好是头结点时,此时right为null,应当直接返回head.next

● 今日收获,记录一下自己的学习时长

public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode left = head;
        ListNode right = head;

        for(;n>0;n--){
            right = right.next;
        }
        if(right==null){
            return left.next;
        }
        while(right.next!=null){
            right = right.next;
            left = left.next;
        }
        left.next = left.next.next;
        return head;
    }

面试题 02.07. 链表相交


● 今日学习的Leetcode链接

链表相交

● 自己看到题目的第一想法

让走完一遍的指针再去走另一边的,直到两指针相交

● 看完代码随想录之后的想法

一样

● 自己实现过程中遇到哪些困难

不需要计数器
如果两者没有交点,走完a+b的步数后,两者都是null,也就是不管是空还是有交点,只要a==b就时返回结果。
跳转时,判断当前是不是null,而不是判断next是不是null (上一步的前提)
如果确定两者都不是一起为null;就可以跳转了,而且跳转一次就可以。

● 今日收获,记录一下自己的学习时长

很好

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode a = headA;
        ListNode b = headB;

        if(a== null || b==null){
            return null;
        }

        while(a!=b){
            a = a.next;
            b = b.next;

            if(a==null && b==null){
                return null;
            }
            if(a == null){
                a = headB;
            }
            if(b == null ){
                b = headA;
            }
            
        }

        return a;
    }

142. 环形链表 II


● 今日学习的Leetcode链接

142. 环形链表 II

● 自己看到题目的第一想法

没有想法

● 看完代码随想录之后的想法

快慢指针

1.判断是否有环
让快指针走两步,慢指针走一步,让快指针去追赶慢指针,如果两者相遇,就是有环
x+y 肯定是 <= x+y+z,而且肯定在慢指针第一圈结束之前(包括结束时)相遇。

2.有环的话入环点在哪
快慢指针相遇后。再有两个点分别从交点和起点出发,两者一起移动一步,两者再相交时,就是入环点。
x=(n-1)(y+z)+z(n>=1) 转n圈后相遇,不可能一圈不转就相遇
y+z是环的一圈
(n-1)(y+z)是>=0的,x大于等于z
也就是指针1走x步,一定会与指针2相遇。
其实是求的x,但是不知道几,z也不知道是几。但是用两者的数学关系:两者会相遇,相遇时,即得到x

● 自己实现过程中遇到哪些困难

好吧,我直接看得代码

● 今日收获,记录一下自己的学习时长

very good 数学知识很重要啊,同志们

public ListNode detectCycle(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;
        while(fast!=null&&fast.next!=null){
            fast = fast.next.next;
            slow = slow.next;
            if(slow == fast){
                ListNode l1 = head;
                ListNode l2 = fast;
                while(l1!=l2){
                    l1 = l1.next;
                    l2 = l2.next;
                }
                return l1;
            }
        }
        return null;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值