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

题目描述

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

思路

由于数据结构是链表,若两个链表存在公共节点,则从该公共节点往后的节点也是公共节点。

如果两个链表长度相等,则从头开始同时遍历两个链表,两个链表第一个相同的节点就是第一个公共节点。如果长度不同,不妨令第一个链表的长度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;
    }
};

总结

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

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