随想录训练营Day4|24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交

243 阅读2分钟

随想录训练营Day4|24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交

标签: LeetCode闯关记


##1.两两交换链表中的节点 ###1.1 题目 相关链接 24. 两两交换链表中的节点

###1.2 解题思路

###1.3 遇到问题 无 ###1.4 算法实现

class Solution {
    public ListNode swapPairs(ListNode head) {
        ListNode dummy = new ListNode(-1, head);
        ListNode cur = dummy;
        ListNode firstNode = null;
        ListNode secondNode = null;
        ListNode temp = null;

        while(cur.next != null && cur.next.next != null){
            //注意提前保存之后需要指向的元素;
            firstNode = cur.next;
            secondNode = cur.next.next;
            temp = cur.next.next.next;
            
            cur.next = secondNode;
            secondNode.next = firstNode;
            firstNode.next = temp;
            cur = firstNode;
        }
        return dummy.next;
    }
}

注意点:待更新

###1.5 题目总结 解题耗时:40min ###1.6 相关题目


##2.19.删除链表的倒数第N个节点 ###2.1 题目 题目:19.删除链表的倒数第N个节点 ###2.2 解题思路

###2.4 实现代码

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        //虚拟头结点
        ListNode dummy = new ListNode(-1,head);
            
        //to delete the node need to find the n+1 node(倒数)
        ListNode x = findFromEnd(dummy,n + 1);//why这里是dummy不是head? 这个返回值不会有变化吗?
        //解法中在链表头部接一个虚拟节点 dummy 是为了避免删除倒数第一个元素时出现空指针异常,在头部加入 dummy 节点并不影响尾部倒数第 k 个元素是什么。不懂这个解释....因为dummy的位置为-1? 但是调用findFromEnd 方法的时候,head为dummy啊?????→理解了,确实是这样,模拟两遍就好,加入dummy之后不会影响;
        //记住:找倒数第n个结点,决定是否找的是正确元素的关键是,p1 和p1 是否相距n;只要p1走了n步之后,p2才出发,那么就是对的.
        //删除倒数第n个结点
        x.next = x.next.next;
        return dummy.next;
    }
    
    //返回倒数第k个结点
    ListNode findFromEnd(ListNode head, int k){
        ListNode p1 = head;
        //p1先走k步
        for(int i = 0; i < k; i++ ){
            p1 = p1.next;
        }
        //然后,p2开始走
        ListNode p2 = head;
        while(p1 != null){
            p1 = p1.next;
            p2 = p2.next;

        }
        //现在,p2 位置为第n-k+1, 即倒数第n个;
        return p2;
    }
}

注意点:

###2.5 题目总结 解题耗时: 40min ###2.6 相关题目


##3. 面试题 02.07. 链表相交 ###3.1 题目 相关链接 面试题 02.07. 链表相交

###3.2 解题思路 一些巧思 ###3.3 遇到问题 无 ###3.4 算法实现

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode p1 = headA, p2 = headB;
    while (p1 != p2) {
        // p1 走一步,如果走到 A 链表末尾,转到 B 链表
        if (p1 == null){p1 = headB;} //为什么不能是p1.next == null?(待问) 这样超过时间限制
        else{p1 = p1.next;}            
        // p2 走一步,如果走到 B 链表末尾,转到 A 链表
        if (p2 == null){p2 = headA;}  //为什么不能是p2.next == null?(待问)
        else{ p2 = p2.next;}           
    }
    return p1;
    }
}

注意点: 条件: p1 == null

###3.5 题目总结 解题耗时:30min ###3.6 相关题目


##4. 今日心得 在动车上要晕过去了, 3.17提前写掉了,明后天有点事,下周一总结复习.