链表专题攻破的新学习笔记

链表专题攻破的新学习笔记

    • 1.分隔链表
    • 2.合并k个升序链表
    • 3.查找链表倒数第k个节点
    • 4.链表的中间节点
    • 5.环形链表
    • 6.环形链表2.0
    • 7.相交链表

之前专门学习了链表,很久没写了,最近在复习有一些新的心得...

1.分隔链表

链表专题攻破的新学习笔记_第1张图片

这说明原链表有粘连 所以需要手动断开原链表中的每个节点的 next 指针 同时还需要继续找下去

2.合并k个升序链表

链表专题攻破的新学习笔记_第2张图片

if(lists.length==0) return null;

这个要放在最开头 否则就会报这个错(其实就是放在优先级队列定义之前)

3.查找链表倒数第k个节点

class Solution {
    public ListNode getKthFromEnd(ListNode head, int k) {
        ListNode p1=head;
        ListNode p2=head;
        for(int i=0;i<k;i++){
            p1=p1.next;
        }
        while(p1!=null&&p1.next!=null){
            p2=p2.next;
            p1=p1.next;
        }
        return p2;
    }
}

如果给出的例子是[1,2,3,4,5] 2 为什么输出会是3-4-5

因为p1.next!=null会提前结束,也就是还没到最后一个节点就结束了,那么p2就会少了一次p2=p2.next,这样就少往后推了一次

当然少推了一次我们可以手动return p2.next嘛

但是这样会导致[1] 1的时候返回错误

4.链表的中间节点

class Solution {
    public ListNode middleNode(ListNode head) {
        ListNode quick=head;
        ListNode slow=head;
        while(quick!=null&&quick.next!=null){
            quick=quick.next.next;
            slow=slow.next;
        }
        return slow;
    }
}

在自己写这道题的时候会在while循环的结束条件考虑很久

一开始写了quick!=null

这会导致以下这种情况的时候,在跑到quick=quick.next.next的时候出现错误,因为到quick.next的时候就回到null,而因为是null无法再继续第二个null所以就会报错

链表专题攻破的新学习笔记_第3张图片

在一直抓不到头脑的时候集中于比较特殊的情况

链表专题攻破的新学习笔记_第4张图片

这种就是当quick在5的时候,slow指针在3,那我们得要让while循环再进行一次才能使slow到达4这个位置(为什么考虑再走一次而不是return slow.next呢,那是因为在链表节点为奇数的时候,quick走到5,slow指针就找到了中点,所以直接return slow即可,那我们不可能对是奇数还是偶数做出判断,即不知道什么时候return slow什么时候return slow.next,所以我就考虑通过判断条件使得奇数的时候不用再走一次,偶数的时候需要再走一次)

那么根据自己手动移动指针发现要再走多一次的循环条件就是当quick指针在5的时候判断quick.next!=null,这样就可以再走多一次,仅一次而已!

可是呢如果循环条件只是quick.next!=null,就会因为quick从5走多一次到达null,而null.next就会报错,所以就需要在quick.next!=null之前判断quick!=null

5.环形链表

其实跟找链表的中间节点很想只是在循环当中看看快慢指针相遇了没有

6.环形链表2.0

链表专题攻破的新学习笔记_第5张图片

这道题的关键在于用距离分析,代码用结点来做

由上图可以获得的信息:

  1. 环的长度:2k-k(ps:可能是长度的n倍)
  2. 头节点到环起点的距离:k-m
  3. 相遇点到环起点的距离:k-m

所以slow在相遇点走k-m步就可以到达环节点,cur指针在头节点走k-m步也能到达环节点

但是实际上我们并不知道m多少,所以我们借鉴找链表中点的思想,即双指针相遇的思想

7.相交链表

注意p1=p1.next和p2=p2.next是要在else里面的 如果只是在while循环里面就会导致每一次都要指针后移 但实际上有一次是需要接上另一条链表的 这里不需要移动

你可能感兴趣的:(LeetCode,链表,学习,笔记)