【刷题记录】相交链表

简介: 【刷题记录】相交链表

本系列博客为个人刷题思路分享,有需要借鉴即可。

1.题目链接:

LINK

2.详解思路:

思路1:用尾结点是否一样来判断是否相交,用相对移位来找到结点

思路2:双层嵌套循环,时间复杂度O(N*N),分析代码略

//错误示例代码:
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 #include<math.h>
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    if(headA==NULL||headB==NULL)//错1:审题问题:题目中明确说没有空链表
    {
        return NULL;
    }
    
    //判断是不是相交链表
    struct ListNode* pTailA = headA;
    struct ListNode* pTailB = headB;
    int skipA = 0;
    int skipB = 0;
  //错2:细节问题:要想要统计结点个数,应该写作while(pTailA)这里最后一个结点没有统计上
    while(pTailA->next)
    {
        pTailA=pTailA->next;
        skipA++;
    }
     while(pTailB->next)
    {
        pTailB=pTailB->next;
        skipB++;
    }
    //如果不是相交链表没必要找,直接跳出
    if(pTailA!=pTailB)
    {
        return NULL;
    }
    //如果是,那么继续
    
    int sub = abs(skipA-skipB); 
    struct ListNode* pmin = NULL;
    struct ListNode* pmax = NULL;
    
    if(skipA<skipB)
    {
        pmin = headA;
        pmax = headB;
    }
    else
    {
        pmin = headB;
        pmax = headA;
    }
    
        
        while(sub--)
        {
            pmax = pmax->next;
        }
//错3:逻辑全面问题:应该写成pmin!=pmax,这里这样写也会跑过一些代码,但是如果刚开始就是交点呢?
        while(pmin->next!=pmax->next&&pmin->next&&pmax->next)
        {
            pmin = pmin->next;
            pmax = pmax->next;
        }
    
    return pmax->next;
}

反例:

所以正确恰当的代码应该如下:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    
    //判断是不是相交链表
    struct ListNode* pTailA = headA;
    struct ListNode* pTailB = headB;
    int skipA = 0;//统计A链表中结点的个数
    int skipB = 0;//统计B链表中结点的个数
    while(pTailA->next)
    {
        pTailA=pTailA->next;
        skipA++;
    }
    skipA++;
     while(pTailB->next)
    {
        pTailB=pTailB->next;
        skipB++;
    }
    skipB++;
    //不是交点
    if(pTailA!=pTailB)
    {
        return NULL;
    }
    //如果是,那么继续
    
    int sub = abs(skipA-skipB); 
    struct ListNode* pmin = NULL;
    struct ListNode* pmax = NULL;
    
    if(skipA<skipB)
    {
        pmin = headA;
        pmax = headB;
    }
    else
    {
        pmin = headB;
        pmax = headA;
    }
    //让长的先走一些,让长短对齐
    while(sub--)
    {
        pmax = pmax->next;
    }
    //找交点
    while(pmin!=pmax)
    {
        pmin = pmin->next;
        pmax = pmax->next;
    }
    
    return pmax;
}

完。

相关文章
|
5月前
|
机器学习/深度学习 算法
24. 两两交换链表中的节点, 19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交
1. **两两交换链表中的节点**:通过引入虚拟头结点,使所有节点都能采用统一的交换逻辑,避免对头结点单独处理。 2. **删除链表的倒数第N个节点**:利用双指针技巧,让快慢指针保持N个节点的距离,当快指针到达末尾时,慢指针正好指向待删除节点的前一个节点。 3. **链表相交**:先计算两链表长度并调整起点,确保从相同距离末尾的位置开始遍历,从而高效找到相交节点或确定无交点。 以上方法均在时间复杂度和空间复杂度上进行了优化,适合用于理解和掌握链表的基本操作及常见算法设计思路。
|
程序员
【刷题记录】移除链表元素
【刷题记录】移除链表元素
105 0
|
算法
❤️算法笔记❤️-(每日一刷-160、相交链表)
❤️算法笔记❤️-(每日一刷-160、相交链表)
120 1
|
Python
【Leetcode刷题Python】114. 二叉树展开为链表
LeetCode上114号问题"二叉树展开为链表"的Python实现,通过先序遍历二叉树并调整节点的左右指针,将二叉树转换为先序遍历顺序的单链表。
134 3
【Leetcode刷题Python】114. 二叉树展开为链表
【数据结构】环形、相交、回文、分割、合并、反转链表
【数据结构】环形、相交、回文、分割、合并、反转链表
123 1
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
190 5
【刷题记录】链表的回文结构
【刷题记录】链表的回文结构
105 1
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
183 4
|
存储 Python
【Leetcode刷题Python】23. 合并K个升序链表
合并K个升序链表的方法:使用数组排序的暴力求解法、使用小顶堆的高效方法,以及分而治之的策略,并提供了相应的Python实现代码。
169 1
下一篇
oss云网关配置