题解 | #两个链表的第一个公共结点#

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

https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46

解题思路

分别遍历两个链表,分别求出结点个数:

若长度不等,求二者差值diff,长链表 的循环指针从头开始 先向后移动 diff 次,短链表 循环指针指向首结点,使两指针所在位置到链表尾部距离相同

若长度相同,不做操作。

两循环指针同时向后移动,如果指向了相同结点,返回该结点元素;否则当到达尾部NULL时,表明两链表无公共部分。

代码实现

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        if(!pHead1 || !pHead2)
        	return NULL;
		ListNode* p1 = pHead1;
		ListNode* p2 = pHead2;
		int count1,count2,diff;
		count1 = count2 =0;
	  
	  //计算链表1的结点总数。
		while(p1){
			count1++;
			p1=p1->next;
		}
	  
	  //计算链表2的结点总数。
		while(p2){
			count2++;
			p2=p2->next;
		}
		p1 = pHead1;
		p2 = pHead2;
	  //较长链表的循环指针首先向后移动 diff 个结点。
		if(count1>count2){
			diff = count1-count2;
			while(diff>0){
				p1 = p1->next;  
				diff--; 
			}  
		}else{
			diff = count2-count1;
			while(diff>0){
				p2 = p2->next;
				diff--;
			}
		}
	  //两个循环指针同时向后移动,指向同一结点时找到了第一个公共结点,返回。
		while(p1){
			if(p1==p2)
				return p1;
			p1 = p1->next;
			p2 = p2->next;
			
		}
		return NULL;  //两循环指针都到达尾部,说明无公共结点
	}
};

时间复杂度

时间复杂度:若两链表结点总数为n,最坏情况下遍历2n个结点,故时间复杂度为O(n)。

空间复杂度:定义变量个数和输入规模无关,为O(1)。

全部评论

相关推荐

07-02 13:50
闽江学院 Java
点赞 评论 收藏
分享
真烦好烦真烦:豆包润色了自己没看看吗,再说了,都说豆包是愚蠢且勤快的大学生,ds才是聪明的研究生,怎么敢让豆包写论文的
你们的毕业论文什么进度了
点赞 评论 收藏
分享
鬼迹人途:你去投一投尚游游戏,服务器一面,第一个图算法,做完了给你一个策略题,你给出方案他就提出低概率问题,答不上当场给你挂
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-03 17:30
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务