160. Intersection of Two Linked Lists
原文题目:
160. Intersection of Two Linked Lists
读题:
给定两个无环链表,判断是否有交叉点,返回第一个交叉点
解题思路:
求出两个链表长度lenA和lenB,得到两者的差值,deltaLen = lenA - lenB,这里假设A长度大于B长度,让p指向A头结点,q指向B头结点,此时,让p先往前走deltaLen个节点,这个时候p和q开始后面的长度,A和B是一样的,对齐之后开始比较p和q,有相等则就是第一个交点,没有的话就是无交点。AC代码如下:
class Solution { public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { int lenA = 0; int lenB = 0; int deltaLen = 0; int loop = 0; ListNode *p = headA; ListNode *q = headB; //链表A和B有一个为空,或者两个都为空,则无交点 if(NULL == headA || NULL == headB) { return NULL; } //求链表A长度 while(p) { lenA++; p = p->next; } //求链表B长度 while(q) { lenB++; q = q->next; } //同时指向开始的头节点 p = headA; q = headB; //如果A长度大于B,则将p往前走deltaLen if (lenA >= lenB) { deltaLen = lenA -lenB; while(deltaLen--) { p = p->next; } q = headB; } //如果A长度小于B,则将q往前走deltaLen else { deltaLen = lenB -lenA; p = headA; while(deltaLen--) { q = q->next; } } //对齐后剩下的节点进行比较 while(p && q) { if(p == q) { return p; } p = p->next; q = q->next; } return NULL; } } int main() { ListNode* result; Solution s; //构造链表A:1->2->3->4->7->8->9 B:5->6->7->8->9 公共节点为7,8,9,返回7 ListNode* node1 = new ListNode(1); ListNode* node2 = new ListNode(2); ListNode* node3 = new ListNode(3); ListNode* node4 = new ListNode(4); ListNode* node5 = new ListNode(5); ListNode* node6 = new ListNode(6); ListNode* node7 = new ListNode(7); ListNode* node8 = new ListNode(8); ListNode* node9 = new ListNode(9); node1->next =node2; node2->next =node3; node3->next = node4; node4->next = node7; node7->next = node8; node8->next = node9; node5->next = node6; node6->next = node7; result = s.getIntersectionNode(node1,node5); cout<<result->val<<endl; }