首页 > 其他 > 详细

【剑指Offer-时间效率与空间效率的平衡】面试题52:两个链表的第一个公共节点

时间:2020-03-18 18:04:01      阅读:51      评论:0      收藏:0      [点我收藏+]

题目描述

输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)

思路

由于数据结构是链表,若两个链表存在公共节点,则从该公共节点往后的节点也是公共节点。
技术分享图片
如果两个链表长度相等,则从头开始同时遍历两个链表,两个链表第一个相同的节点就是第一个公共节点。如果长度不同,不妨令第一个链表的长度len1大于第二个链表的长度len2,则先遍历长的链表len1-len2步,这样两个链表剩余的长度就相等了,此时再同时遍历两个链表,直至找到第一个公共节点。代码如下:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        int len1 = getListLen(pHead1);
        int len2 = getListLen(pHead2);
        
        ListNode* pLong(0);
        ListNode* pShort(0);
        int delta = 0;
        if(len1>len2){
            pLong = pHead1;
            pShort = pHead2;
            delta = len1-len2;
        }else{
            pLong = pHead2;
            pShort = pHead1;
            delta = len2-len1;
        }
        
        while(delta>0){
            pLong = pLong->next;
            delta--;
        }
        
        while(pLong!=nullptr && pShort!=nullptr){
            if(pLong==pShort)
                return pLong;
            pLong = pLong->next;
            pShort = pShort->next;
        }
        return nullptr;
    }
    
    int getListLen(ListNode* pHead){
        int len=0;
        ListNode* temp = pHead;
        while(temp!=nullptr){
            temp = temp->next;
            len++;
        }
        return len;
    }
};

总结

有些关于链表的问题都可以使用一快一慢的两个指针来解决。

【剑指Offer-时间效率与空间效率的平衡】面试题52:两个链表的第一个公共节点

原文:https://www.cnblogs.com/flix/p/12518096.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!