剑指offer 41.两个链表的第一个公共节点

  1. 题目:输入两个链表,找出它们的第一个公共结点。
  2. 思路:
    1. 暴力思路,遍历某链表的每一个节点,如果之后的节点都相同,那么该节点为第一个公共节点,复杂度m*n
    2. 优化思路:从后往前的思路,后面的节点都是相同的,第一个不相同的节点的next即为第一个公共节点,复杂度m+n
  3. 启发或者坑
    1. 所有的结果必须有返回值:报错了control reaches end of non-void function
    2. 要取stack的top值,必须先判断是否为null
  4. 代码
    /*
    struct ListNode {
    	int val;
    	struct ListNode *next;
    	ListNode(int x) :
    			val(x), next(NULL) {
    	}
    };*/
    class Solution {
    public:
        ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
            if (pHead1 == NULL || pHead2 == NULL)
                return NULL;
            stack<ListNode*> p1;
            stack<ListNode*> p2;
            while(pHead1) {
                p1.push(pHead1);
                pHead1 = pHead1->next;
            }
            while(pHead2) {
                p2.push(pHead2);
                pHead2 = pHead2->next;
            }
            
            ListNode* temp = NULL;
            while (!p1.empty() && !p2.empty()) {  //在判断top之前需要判断是否为空
                if (p1.top() == p2.top()) {
                    temp = p1.top();
                    p1.pop();
                    p2.pop();
                } else {
                    return temp;
                }
            }
            return temp;  //所有结果必须有返回值
        }
    };
发布了131 篇原创文章 · 获赞 5 · 访问量 7385

猜你喜欢

转载自blog.csdn.net/Alexia23/article/details/103892288