【Leedcode】数据结构中链表必备的面试题(第四期)

【Leedcode】数据结构中链表必备的面试题(第四期)



1.题目

  1. 相交链表: 如下(示例):
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。

1.判断两个链表是否相交? 2.如果相交,求交点


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


2.思路+图解

(1)思路一

暴力求解-穷举法。依次取A链表中的每个节点跟B链表中的所有结点比较。
如果有相同的结点,就是相交,第一个相同的交点就是公共结点。这样做的时间复杂度为:O(N^2)
那么我们如何把时间复杂度优化到:O(N)


(2)思路二

1.尾结点相同就是相交,否则就不相交
2.求交点:长的链表先走(长度差)步,再同时走,第一个相同的结点就是交点
具体如下图


在这里插入图片描述


再这里要注意:可以用lenA和lenB去算两个链表的长度,方便求交点位置,如下图
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


3.源代码

代码如下(示例):

struct ListNode 
{
    
    
     int val;
     struct ListNode *next;
};
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
    
    
    struct ListNode* pheadA = headA;
    struct ListNode* pheadB = headB;
    //先判断是否为环形结构
    int lenA = 1;
    while(pheadA -> next)
    {
    
    
        lenA++;
        pheadA = pheadA -> next;
    }
    int lenB = 1;
    while(pheadB -> next)
    {
    
    
        lenB++;
        pheadB = pheadB -> next;
    }
    if(pheadA != pheadB)
    {
    
    
        return NULL;
    }
    int sub = abs(lenA - lenB);
    struct ListNode* longlist = headA;
    struct ListNode* shortlist = headB;
    if(lenA < lenB)
    {
    
    
        longlist = headB;
        shortlist = headA;
    }
    //长的先走sub步
    while(sub--)
    {
    
    
        longlist = longlist -> next;
    }
    //俩个开始一起走
    while(longlist != shortlist)
    {
    
    
        longlist = longlist -> next;
        shortlist = shortlist -> next;
    }
    return longlist;
}

总结

以上就是今天要讲的内容,本文介绍数据结构中链表必备的面试题(第四期)
如果我的博客对你有所帮助记得三连支持一下,感谢大家的支持!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/2201_75587702/article/details/129193276