Question
输入两个链表,找出它们的第一个公共结点。
关键词:链表 公共节点
Solution
如果两个链表存在公共链表(表头即第一个公共节点)C,那么两条链表可以看成A+C和B+C,如果len(A)==len(B),两个指针一起走走到第一个相同的节点,这个节点就是答案,不需要去比较剩下的节点。但是A、B显然不一定相等,我们使得A’=A+B, B’=B+A,这时A’和B’的长度就一定相同。但是我们其实也没办法直接做到A+B或者B+A,不过我们可以做到A+C+B+C或者B+C+A+C,等效于A‘+C和B’+C。
同步
时间复杂度:O(N)
空间复杂度:O(N)
- Python
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
if not pHead1 or not pHead2: return None;
p1 = pHead1
p2 = pHead2
while p1!=p2:
p1 = p1.next
p2 = p2.next
if p1 != p2: # 注意如果没有节点,此时p1,p2实际上都为NULL,需要中止循环而不是继续数下去
if not p1: p1 = pHead2 # 不需要实际连接pHead1和2,不然循环也无法终止
if not p2: p2 = pHead1
return p1
- C++
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
if(!pHead1 || !pHead2) return NULL;
ListNode* p1 = pHead1;
ListNode* p2 = pHead2;
while(p1!=p2){
p1 = p1->next;
p2 = p2->next;
if(p1!=p2){ //注意如果没有节点,此时p1,p2实际上都为NULL,需要中止循环而不是继续数下去
if(!p1) p1 = pHead2; // 不需要实际连接pHead1和2,不然循环也无法终止
if(!p2) p2 = pHead1;
}
}
return p1;
}
};