力扣---LeetCode160. 相交链表(代码详解+流程图)

简介: 第十弹——力扣LeetCode每日一题

前言


“风格相同的人总会相遇 千万个人中万幸得以相逢.”

本章的内容是力扣每日随机一题的部分方法的解析

160. 相交链表


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

链接:

160. 相交链表link

思路:


根据题目这是两个问题先判断是否相交在找到两个链表相交的起始节点。

判断是否相交


尾节点是否相等相等尾节点相等就相交(不是比较值而是地址)

例如下图A B链表尾节点值相等但是不相交

寻找相交起始节点


1.A链表所有节点跟B链表都比较一遍,相等的那个就是交点

2.分别求两个链表的长度countA和countB,长的先走差距步|countA-countB|步再同时走,第一个相等的就是相交

方法一:暴力求解法


1.1 时间复杂度:O(M*N)


1.2 代码:


struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
    struct ListNode *tailA=headA;
    struct ListNode *tailB=headB;
    while(tailA)
    {
        tailB=headB;
        while(tailB)
        {
            if(tailA!=tailB)
            {
                tailB=tailB->next;
            }
            else
            {
                return tailA;
            }
        }
        tailA=tailA->next;
    }
    return NULL;
}

方法二:双指针


2.1 时间复杂度:O(N)


2.2 代码:


struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
    struct ListNode *tailA=headA;
    struct ListNode *tailB=headB;
    int countA=1;
    int countB=1;
    while(tailA->next)
    {
        tailA=tailA->next;
        countA++;
    }
    while(tailB->next)
    {
        tailB=tailB->next;
        countB++;
    }
    if(tailA!=tailB)
    {
        return NULL;
    }
    //这里也可以使用三目操作符
    int gap=abs(countA-countB);
    struct ListNode *longlist=headA;
    struct ListNode *shortlist=headB;
    if(countA<countB)
    {
        longlist=headB;
        shortlist=headA;
    }
    while(gap--)
    {
        longlist=longlist->next;
    }
    while(longlist!=shortlist)
    {
        longlist=longlist->next;
        shortlist=shortlist->next;
    }
    return longlist;
}

2. 3流程图:


注意:


这种链表是不可以逆置的,因为c1这个节点只有一个next所以不可能有两个next同时指向a2和b3(error)

补充一个知识点:


abs 函数是存在于多种编程语言(包括且不限于:C语言、C++、Fortran、Matlab、Pascal、Delphi、Visual Basic 和 VBA)中的一种用于求数据绝对值的函数。

总结


Ending,今天的力扣每日一题内容就到此结束啦,如果后续想了解更多,就请关注我吧。

相关文章
|
5天前
【bug记录】旋转链表与力扣报错:member access within null pointer of type ‘struct ListNode‘
【bug记录】旋转链表与力扣报错:member access within null pointer of type ‘struct ListNode‘
|
1月前
【数据结构OJ题】相交链表
力扣题目——相交链表
18 1
【数据结构OJ题】相交链表
|
14天前
|
算法 Python
【Leetcode刷题Python】106.相交链表
采用双指针法来找出两个链表的相交起始节点,并详细解释了算法的时间和空间复杂度。
11 1
|
5天前
|
机器学习/深度学习
【刷题记录】相交链表
【刷题记录】相交链表
|
1月前
|
Java
力扣经典150题第六十题:反转链表 II
力扣经典150题第六十题:反转链表 II
14 1
|
1月前
2670.找出不同元素数目差数组-力扣(LeetCode)
2670.找出不同元素数目差数组-力扣(LeetCode)
15 0
|
1月前
|
索引
821.字符的最短距离-力扣(LeetCode)
821.字符的最短距离-力扣(LeetCode)
15 0
|
2月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
2月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
2月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
17 2