题解 | #两个链表的第一个公共结点#

两个链表的第一个公共结点

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;
    }
};
全部评论

相关推荐

贺兰星辰:不要漏个人信息,除了简历模板不太好以外你这个个人简介是不是太夸大了...
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务