查找两个链表的第一个公共结点

简介: 查找两个链表的第一个公共结点

一、题目描述

输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。

例如,输入{1,2,3},{4,5},{6,7}时,两个无环的单向链表的结构如下图所示:

可以看到它们的第一个公共结点的结点值为6,所以返回结点值为6的结点。

要求:时间复杂度不超过O(n),空间复杂度不超过O(1)。

二、解题思路

对于该题我首先想到的是对两个链表同时进行遍历,若两个结点相同,则直接返回相同结点,但是提交之后无法通过,最后发现我的这种解法只适合等长链表求相同结点,这种解法并不可行。

正确解法

由于时间复杂度不超过O(n),那么最多只能遍历一次,我们可以设置两个结点分别指向链表的首元结点,两个链表都进行遍历,就是如果当前的链表遍历完之后,就让其遍历另一条链表,因为遍历的速度一样,且遍历的总长度一样,如果有相同结点则一定会在遍历结束前找到,否则没有相同结点。

三、代码实现

/*
public class ListNode {
    int val;
    ListNode next = null;
 
    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        ListNode cur1=pHead1;
        ListNode cur2=pHead2;
        while(cur1!=cur2){//这里未用equals原因是题目要求的结点相同,不仅仅是内容上相同,更重要的是地址相同,也就是同一个结点。
 
            if(cur1==null){
                cur1=pHead2;
            }else{
                cur1=cur1.next;
            }
           if(cur2==null){
               cur2=pHead1;
           }else{
               cur2=cur2.next;
           }
        }
        return cur1;
    }
}

目录
相关文章
|
1月前
19 删除链表的倒数第 N 个结点
19 删除链表的倒数第 N 个结点
|
1月前
|
算法
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
|
1月前
|
算法 安全 数据处理
LeetCode刷题---707. 设计链表(双向链表-带头尾双结点)
LeetCode刷题---707. 设计链表(双向链表-带头尾双结点)
|
11天前
|
算法
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
17 0
|
3天前
|
算法
19.删除链表的倒数第N个结点
19.删除链表的倒数第N个结点
|
11天前
|
算法
数据结构和算法学习记录——线性表之双向链表(下)-头插函数、头删函数、查找函数、pos位置之前插入结点、pos位置删除结点及其复用、销毁链表函数
数据结构和算法学习记录——线性表之双向链表(下)-头插函数、头删函数、查找函数、pos位置之前插入结点、pos位置删除结点及其复用、销毁链表函数
9 0
|
11天前
|
算法
数据结构和算法学习记录——习题-翻转链表(不带表头结点逆置算法、带表头结点的链表逆置算法)
数据结构和算法学习记录——习题-翻转链表(不带表头结点逆置算法、带表头结点的链表逆置算法)
9 0
|
20天前
题目----力扣--链表的中间结点
题目----力扣--链表的中间结点
9 0
|
21天前
|
索引
【力扣刷题】删除链表的倒数第 N 个结点、两两交换链表中的节点、随机链表的复制
【力扣刷题】删除链表的倒数第 N 个结点、两两交换链表中的节点、随机链表的复制
20 0
|
26天前
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点