题解 | #两个链表的第一个公共结点#
两个链表的第一个公共结点
http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46
一种暴力求解方法
可能麻烦了点,但是思路感觉容易理解一些
具体实现:
① 保证两条链表的长度相同
② 找出共同的链表
最终,空间复杂度O(1),时间复杂度O(2n)->O(n)
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
// 找出较长的链表,假设最长的链表为n,则时间复杂度为O(n)
int count1 = 0, count2 = 0;
ListNode *tempNode1 = pHead1, *tempNode2 = pHead2;
while(tempNode1 || tempNode2){
if (tempNode1){ count1 += 1; tempNode1 = tempNode1->next;}
if (tempNode2){ count2 += 1; tempNode2 = tempNode2->next;}
}
// 对较长的链表顺后,保证两条链表长度相当。时间复杂度为O(k)
int count = count1 - count2;
int i = (count < 0) ? (count*(-1)) : count;
while(i){
(count > 0 ? pHead1 : pHead2) = (count > 0 ? pHead1 : pHead2)->next;
i--;
}
// 找出公共链表。时间复杂度为O(n-k)
while(pHead1){
if (pHead1 == pHead2){ return pHead1; }
pHead1 = pHead1->next;
pHead2 = pHead2->next;
}
return pHead1;
}
};