单链表Ⅲ(LeetCode)

个人主页 : 流年如梦

专栏 : 《C语言》 《数据结构》

文章目录

一.相交链表

点击转跳👈

原题 :

🧐思路 :这道题要找两个链表的相交节点,核心方法是双指针拼接法;先用两个指针分别遍历两个链表,当一个链表遍历完后,就跳到另一个链表的头部继续遍历;这两个指针最终会同时到达相交节点(如果相交),或者同时到达NULL(如果不相交)

参考代码如下:

c 复制代码
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode *pA = headA, *pB = headB;
    while (pA != pB) {
        pA = pA ? pA->next : headB;
        pB = pB ? pB->next : headA;
    }
    return pA;
}

二.环形链表Ⅰ

点击转跳👈

原题 :

🧐思路 :这道题是判断链表是否有环,核心用快慢指针法;快指针每次走两步,慢指针每次走一步;如果链表有环,快指针一定会在环内追上慢指针;如果没环,快指针会先走到链表末尾

参考代码如下:

c 复制代码
bool hasCycle(struct ListNode *head) {
    struct ListNode *slow = head, *fast = head;
    while (fast && fast->next) {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast) {
            return true;
        }
    }
    return false;
}

三.环形链表Ⅱ

点击转跳👈

原题 :

🧐思路 :这道题的核心思路也是老方法快慢指针法;先用快慢指针判断链表是否有环(快指针走两步,慢指针走一步,相遇则有环);当相遇后,让一个指针回到链表头,两个指针同时以相同速度前进,再次相遇的节点就是入环点

参考代码如下:

c 复制代码
struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode *slow = head, *fast = head;
    while (fast && fast->next) {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast) {
            struct ListNode *p = head;
            while (p != slow) {
                p = p->next;
                slow = slow->next;
            }
            return p;
        }
    }
    return NULL;
}

四.随机链表的复制

点击转跳👈

原题 :

🧐思路 :这道题的核心思路是在原节点后插入复制节点 + 拆分链表 ;先遍历原链表,在每个节点后面插入它的复制节点;再遍历链表,给每个复制节点设置random指针(copy->random = old->random ? old->random->next : NULL);把链表拆分成原链表和复制链表两部分,返回复制链表的头节点

参考代码如下:

c 复制代码
struct Node* copyRandomList(struct Node* head) {
    if (head == NULL) return NULL;
    struct Node* cur = head;
    while (cur) {
        struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
        copy->val = cur->val;
        copy->next = cur->next;
        cur->next = copy;
        cur = copy->next;
    }
    cur = head;
    while (cur) {
        struct Node* copy = cur->next;
        copy->random = cur->random ? cur->random->next : NULL;
        cur = copy->next;
    }
    cur = head;
    struct Node* copyHead = head->next;
    while (cur) {
        struct Node* copy = cur->next;
        cur->next = copy->next;
        cur = cur->next;
        if (cur) {
            copy->next = cur->next;
        }
    }
    return copyHead;
}

🎯总结

这四道链表题,核心都是用双指针解决链表问题

  1. 复制随机链表 --> 通过在原节点后插入副本,再拆分链表实现深拷贝
  2. 环形链表判断 --> 快慢指针追逐法,相遇即说明有环
  3. 环形链表入环点 --> 快慢指针相遇后,再用同速指针定位入环点
  4. 相交链表 --> 双指针交叉遍历,相遇点就是相交节点

👀 关注 我们一路同行,从入门到大师,慢慢沉淀、稳步成长
❤️ 点赞 鼓励原创,让优质内容被更多人看见
⭐ 收藏 收好核心知识点与实战技巧,需要时随时查阅
💬 评论 分享你的疑问或踩坑经历,一起交流避坑、共同进步

相关推荐
别动我齐刘海17 分钟前
机器人 C++ / 系统联调补强2——异常处理、Protobuf
linux·c++·人工智能·学习·算法·机器学习·机器人
fish_zzzz37 分钟前
笔记-论数据结构1
数据结构
文丑颜不良啊1 小时前
LeetCode276~300题目解析
java·leetcode
荆棘鸟智能1 小时前
短历时洪水预报算法实践:水文模型与 LightGBM 残差订正融合
人工智能·算法·机器人
wuyk5551 小时前
《WiFi 嵌入式物联网开发全套实战》 | 第 45 章【终章】WiFi 开发全套知识复盘 + 面试高频题 + 进阶路线
物联网·面试·职场和发展
葫三生2 小时前
关于三生原理系列被技术开发社区批量收录或引发策展边界讨论的一种思考
大数据·人工智能·深度学习·算法·机器学习·数据挖掘·开源
catcatuncle2 小时前
OpenWorkBuddy 部署排错手册:从源码启动到自己搭一个给团队用,七个最容易卡住的地方
算法
avi91112 小时前
【AI教人】在Inspector显示所有Delegate-Odin Inspector之三
java·前端·算法·delegate·inspector·editor扩展·unity editor
淡海水2 小时前
06-02-源码-增量标记算法实现
算法·unity·c#·gc
碧海银沙音频科技研究院2 小时前
实现炬芯ATS308X的usb cdc 串口IAP 固件升级功能实现
人工智能·嵌入式硬件·深度学习·算法