题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
思路:因为正常情况下,两个链表前面部分是不同的,后面部分是相同的,所以从后往前查看比较容易。因此需要借助栈。
将两个链表分别从表头开始装入栈中,全部装入完后。两个栈再同时进行出栈操作,并且进行判断两者是否相等,一直找到不等的节点,那么他们的上一个节点就是我们所找的节点。
/* 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*> stack1; stack<ListNode*> stack2; //将链表1放入栈中 while(pHead1!=NULL){ stack1.push(pHead1); pHead1 = pHead1->next; } //将链表2放入栈中 while(pHead2!=NULL){ stack2.push(pHead2); pHead2 = pHead2->next; } //两个栈同时往外出 ListNode* p = stack1.top(); ListNode* q = stack2.top(); ListNode* result = NULL; while(!stack1.empty() && !stack2.empty()){ p = stack1.top(); q = stack2.top(); if(p->val == q->val){ result = stack1.top(); stack1.pop(); stack2.pop(); } else{ break; } } return result; } };