标签:p2 结点 p1 ListNode next 链表 pHead1 pHead2 公共
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
图解:
思路1:
先统计两个链表长度,求出相差的步数len3;
让长的先走len3步,然后两个一块走,当两个指针相等时就是公共节点了
// 先统计两个链表长度,找出长度之差,让长的先走(长度之差步),然后一块走,节点相同就是要找的 // 时间复杂度O(m+n), 空间复杂度o(1) class Solution { public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { if(pHead1 == nullptr || pHead2 == nullptr) return nullptr; // 先统计两个链表长度 int len1 = 1, len2 = 1; ListNode *p1 = pHead1, *p2 = pHead2; while(p1) { p1 = p1->next; len1++; } while(p2) { p2 = p2->next; len2++; } int len3 = (len1 > len2) ? len1-len2 : len2-len1; // 长的先走 len3步 if(len1 > len2) { while(len3--) { pHead1 = pHead1->next; } } else if(len1 < len2) { while(len3--) pHead2 = pHead2->next; } // 两个一块走 while(pHead1 && pHead2 ) { if (pHead1 == pHead2) return pHead1; pHead1 = pHead1->next; pHead2 = pHead2->next; } } };
思路2:
这个操作有点高,牛客讨论区看的
class Solution { public: ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) { ListNode *p1 = pHead1; ListNode *p2 = pHead2; while(p1!=p2){ p1 = (p1==NULL ? pHead2 : p1->next); p2 = (p2==NULL ? pHead1 : p2->next); } return p1; } };
标签:p2,结点,p1,ListNode,next,链表,pHead1,pHead2,公共 来源: https://www.cnblogs.com/xiaokang01/p/12507641.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。