代码随想录第4天

代码随想录训练营第4天,链表也要收尾啦。

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

题目描述:
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

解法一:设置虚拟头节点

基本思路:建议画图

  1. 首先设置虚拟头结点 dummyHead,并将其指向原本的头结点,且为当前节点 cur
    进入循环,终止条件为头结点后面不存在两个节点
  2. 通过改变指针的方向来交换头结点后面两个点node1,node2的位置
  • cur.next = node2
  • node2.next = node1;
  • node1.next = node2.next;
  1. 更新 cur 的位置,往后移一位
class Solution {
    public ListNode swapPairs(ListNode head) {
        //创建虚拟头节点,将虚拟头节点设成当前节点cur
        ListNode dummyHead = new ListNode(0);
        dummyHead.next = head;
        ListNode cur = dummyHead; 
        while(cur.next != null && cur.next.next != null){
            ListNode node1 = cur.next;
            ListNode node2 = cur.next.next;
            //三部曲,注意顺序
            cur.next = node2;
            node1.next = node2.next;
            node2.next = node1;
            cur = node1;
        }
        return dummyHead.next;
    }
}

解法二:迭代法 (稍后更新)

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

题目描述:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?

解法一:快慢指针+虚拟头节点

主旨:设置快慢指针,想让快指针走n步,然后让快慢指针同时走,等快指针指向null的时候,删除慢指针所指的点;
1.设置虚拟头,初始化快慢指针,都指向虚拟头
2.快指针走/n+1/步,为的是让慢指针指向要删的前一个节点,方便链表操作
3.快慢指针同时走,快指针指向null时停
4.慢指针删除它目前位置的下一个节点
5.返回头节点

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        //初始设置,双指针法
        ListNode dummyHead = new ListNode(0);
        dummyHead.next = head;
        ListNode fast = dummyHead;
        ListNode slow = dummyHead;
        //先让fast指针跑n个位置
        for(int i=0; i<n;i++){
            fast = fast.next;
        }
        //当fast 在n 位上时,slow 和 fast 同时往前,直到fast走到底        
        while(fast.next != null){
           fast = fast.next;
           slow = slow.next; 
        }
        slow.next = slow.next.next;
        return dummyHead.next;
    }
}

面试题 02.07. 链表相交

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null。

解法一:常规解法

基本思路:
找出两个链表交点的指针;比较指针,不是比较值
题目为了方便比较,默认数值相同则指针就相同!
1.设置currA,currB两指针,分别指向两个链表的表头;
2.计算A,B长度;将长的链表设为A,并且移动currA到B表头的位置;让currA和currB处于同一起跑线
3.currA,currB同时移动,如果指针相同,则返回currA;没有则返回null。

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        //初始化
        ListNode currA = headA;
        ListNode currB = headB;
        int lenA = 0;
        int lenB = 0;
        //计算两个链表的长度
        while(currA != null){
            lenA++;
            currA = currA.next;
        }
        while(currB != null){
            lenB++;
            currB = currB.next;
        }
        //将当前节点重新初始化头节点
        currA = headA;
        currB = headB;
        //确保A链表是长的那个
        if(lenB > lenA){
            int tempL = lenB;
            lenB = lenA;
            lenA = tempL;
            ListNode tempN = currB;
            currB = currA;
            currA = tempN;
        }
         int gap = lenA - lenB;
        //当链表A被遍历到和B链表一样的位置时,currA 和 currB 齐头并进
         for (int i = 0; i < gap;i++){
             currA = currA.next;
         }
         while(currA != null){
             if (currA == currB){
                 return currA;
             }
             currA = currA.next;
             currB = currB.next;
         }
         return null;
    }
}

解法二:高级解法

解题思路:把两条链表相加,成为一条长的链表
headA先遍历表A再去遍历表B;
headB先遍历表B再去遍历表A;
当A,B重合时:
·如果有公共节点,则停在公共节点上;
·如果没有公共节点,两点只会都停在null上
因此,返回A即可;

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode A = headA;
        ListNode B = headB;
        while(A != B){
            A = A != null ? A.next : headB;
            B = B != null ? B.next : headA;
        }
        return A;
    }
}

142.环形链表II

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。

解法一:快慢指针

基本思路:

  1. 设置 fast 和 slow 两个指针,开始遍历链表;初始化都在 head 节点。
  2. fast 每次走两步,slow 每次走一步,如果存在环,则 fast 和 slow 必定在环内相遇;如果不存在环,则返回 null
  3. 当 fast 和 slow 相遇时,将 index1 设为 fast 的位置,将 index2 设为 head 的位置;每次 index1 和 index2 都走一步,最终 index1 和 index2 会在环入口相遇。则返回 index1.
    具体证明过程,见https://programmercarl.com/0142.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8II.html#%E6%80%9D%E8%B7%AF
public class Solution {
    public ListNode detectCycle(ListNode head) {
        // if (head == null || head.next == null){
        //     return null;
        // }
        ListNode slow = head;
        ListNode fast = head;
        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
            if (fast == slow){
                ListNode index1 = fast;
                ListNode index2 = head;
                while(index1 != index2){
                    index1 = index1.next;
                    index2 = index2.next;
                }
                return index1;
            }
        }
        return null;
    }
}

解法二:哈希表(稍后更新)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容