JZ36 两个链表的第一个公共节点*
题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
方法1(使用set)
思路
利用unordered_set容器存放数据不重复的思想,将链表1的节点全都放进unordered_set容器中去,然后遍历链表2,在容器中找有没有链表2的节点,第一次找到的节点就是两个链表的第一个公共节点
代码
class Solution { public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { unordered_set<ListNode*> s; ListNode* p1=pHead1; ListNode* p2=pHead2; while(p1!=NULL) { s.insert(p1); p1=p1->next; } //unordered_set<ListNode*>::iterator pos; while(p2!=NULL) { if(s.find(p2)!=s.end()) return p2; p2=p2->next; } return NULL; } };
方法2(快慢指针思想)
思路
- 首先计算出两个链表的长度
- 让长的链表指针先走差值步
- 两个指针同时走,直到相遇(相遇时的节点即为链表的第一个公共节点)
代码
class Solution { public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { if(pHead1==NULL||pHead2==NULL) return NULL; ListNode* p1=pHead1; ListNode* p2=pHead2; int len1=0,len2=0; int k=0; while(p1!=NULL) { len1++; p1=p1->next; } p1=pHead1; while(p2!=NULL) { len2++; p2=p2->next; } p2=pHead2; if(len1>len2) { k=len1-len2; while(k) { p1=p1->next; k--; } } else { k=len2-len1; while(k) { p2=p2->next; k--; } } while(p1!=NULL&&p2!=NULL&&p1!=p2) { p1=p1->next; p2=p2->next; } return p2; } };
这个方法有个问题;上面代码的最后一个while我一开始是这么写的,然后就只通过了42.86,这是为什么嘞: