两个链表的第一个公共结点-输入两个链表,找出它们的第一个公共结点。
1、蛮力法:
1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 ListNode(int x) : 6 val(x), next(NULL) { 7 } 8 };*/ 9 class Solution { 10 public: 11 ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) { 12 if(pHead1==NULL||pHead2==NULL) 13 return NULL; 14 ListNode* p1; 15 ListNode* p2; 16 for(p1=pHead1;p1!=NULL;p1=p1->next){ 17 for(p2=pHead2;p2!=NULL;p2=p2->next){ 18 if(p1==p2) 19 return p1; 20 } 21 } 22 return NULL; 23 } 24 };
2、
从链表的定义可以看出,这两个链表是单链表,如果两个链表有公共节点,那么这两个链表从某一节点开始,它们的m_pNext都指向同一个节点,之后它们所有的节点都是重合的,不可能再出现分叉。所以拓扑形状看起来是Y型。
一个简单的方法是:首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个节点。在第二次遍历的时候,先在较长的节点上走若干步,接着同时在两个链表上遍历,找到的第一个相同的节点就是它们的公共的节点。
1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 ListNode(int x) : 6 val(x), next(NULL) { 7 } 8 };*/ 9 class Solution { 10 public: 11 ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) { 12 if(pHead1==NULL||pHead2==NULL) 13 return NULL; 14 int l1=0,l2=0; 15 ListNode* p1=pHead1; 16 ListNode* p2=pHead2; 17 while(p1!=NULL){ 18 l1++; 19 p1=p1->next; 20 } 21 while(p2!=NULL){ 22 l2++; 23 p2=p2->next; 24 } 25 int d1=0,d2=0; 26 if(l1>l2) 27 d1=l1-l2; 28 if(l1<l2) 29 d2=l2-l1; 30 p1=pHead1; 31 p2=pHead2; 32 while(d1!=0){ 33 p1=p1->next; 34 d1--; 35 } 36 while(d2!=0){ 37 p2=p2->next; 38 d2--; 39 } 40 while(p1!=NULL&&p2!=NULL){ 41 if(p1==p2) 42 return p1; 43 p1=p1->next; 44 p2=p2->next; 45 } 46 return NULL; 47 } 48 };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了