leetcode:160. 相交链表

简介: leetcode:160. 相交链表

一、题目

原题链接:160. 相交链表 - 力扣(LeetCode)

 

函数原型:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)

二、思路

判断两个链表是否相交,只要判断两个链表是否有相同的结点即可。

有两种方法:

1.暴力解法:遍历链表A的每个结点,然后遍历链表B看是否能找到链表A的结点

2.遍历指针齐步走:先遍历两个链表,计算出它们的长度和长度差。然后让较长的链表的遍历指针先走长度差个结点,这样两个链表的遍历指针就相当于齐步遍历。通过比较这两个齐步遍历的指针的结点是否相同,即可判断链表是否相交;如果当链表遍历完后也没有找到相同的结点,则说明两个链表不相交。

三、代码

本题只提供第二种方法的代码,如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode *curA=headA;
    struct ListNode *curB=headB;
    int lenA=0;
    int lenB=0;
    while(curA)//计算链表A的长度
    {
        lenA++;
        curA=curA->next;
    }
    while(curB)//计算链表B的长度
    {
        lenB++;
        curB=curB->next;
    }
    curA=headA;//遍历指针回到头结点
    curB=headB;//遍历指针回到头结点
    int n=abs(lenA-lenB);//链表A和链表B的长度差距
    if(lenA>=lenB)//链表A长度大于等于链表B长度,链表A的遍历指针先走n个结点
    {
        while(n--)
        {
            curA=curA->next;
        }
    }
    else//链表B长度大于链表A长度,链表B的遍历指针先走n个结点
    {
        while(n--)
        {
            curB=curB->next;
        }
    }
    while(curA&&curB)
    {
        if(curA==curB)//找到了相同的结点
            return curA;
        else
        {
            curA=curA->next;
            curB=curB->next;
        }
    }
    return NULL;//两个链表遍历完没有发现相同的结点,说明不相交,返回空
}


目录
相关文章
|
1月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
|
1月前
|
存储 算法
LeetCode第86题分隔链表
文章介绍了LeetCode第86题"分隔链表"的解法,通过创建两个新链表分别存储小于和大于等于给定值x的节点,然后合并这两个链表来解决问题,提供了一种简单易懂且操作原链表的解决方案。
LeetCode第86题分隔链表
|
1月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
1月前
|
算法
LeetCode第23题合并 K 个升序链表
这篇文章介绍了LeetCode第23题"合并K个升序链表"的解题方法,使用分而治之的思想,通过递归合并链表的方式解决了这个难题。
LeetCode第23题合并 K 个升序链表
|
22天前
|
C++ 索引
leetcode 707.设计链表
本文提供了解决LeetCode 707题"设计链表"的C++实现,包括单链表的节点定义和类方法实现,如添加节点、获取节点值、删除节点等。
|
1月前
|
算法
LeetCode第92题反转链表 II
文章分享了LeetCode第92题"反转链表 II"的解法,通过使用四个指针来记录和更新反转链表段的头部、尾部以及前一个和后一个节点,提供了一种清晰且易于理解的解决方案。
LeetCode第92题反转链表 II
|
1月前
|
算法
LeetCode第21题合并两个有序链表
该文章介绍了 LeetCode 第 21 题合并两个有序链表的解法,通过创建新链表,依次比较两个链表的头节点值,将较小的值插入新链表,直至其中一个链表遍历完,再将另一个链表剩余部分接到新链表后面,实现合并。
LeetCode第21题合并两个有序链表
|
1月前
|
算法
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
|
1月前
|
机器学习/深度学习
【刷题记录】相交链表
【刷题记录】相交链表
|
1月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
43 0