剑指offer 两个链表的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点。
思路:两个单链表从第一个公共节点后所有节点都会一样。可以暴力搜索,复杂度O(mn).可以从前往后,或者从后往前(利用栈)找到最后一个公共的节点。
1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 ListNode(int x) : 6 val(x), next(NULL) { 7 } 8 };*/ 9 class Solution { 10 public: 11 ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { 12 stack<ListNode*> a, b; 13 ListNode *p1 = pHead1, *p2 = pHead2, *last = NULL; 14 if (p1 == NULL || p2 == NULL) { 15 return NULL; 16 } 17 while (p1 != NULL) { 18 a.push(p1); 19 p1 = p1->next; 20 } 21 while (p2 != NULL) { 22 b.push(p2); 23 p2 = p2->next; 24 } 25 while (!a.empty() && !b.empty()) { 26 p1 = a.top(); 27 a.pop(); 28 p2 = b.top(); 29 b.pop(); 30 if (p1 == p2) { 31 last = p1; 32 } else { 33 break; 34 } 35 } 36 return last; 37 } 38 };
越努力,越幸运