标签:长度 时间复杂度 一个 str 第一个公共结点 ima next 测试 输入
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
图解:
思路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; } };
标签:长度 时间复杂度 一个 str 第一个公共结点 ima next 测试 输入
原文地址:https://www.cnblogs.com/xiaokang01/p/12507641.html