由于链表的特殊性质,一旦多条链表在一个节点相交,那么后面所有的节点都是重合的。所以,链表相交一定发生在链表的尾部。
解决方案是,把两条链表尾部对齐,使两指针一起移动,如果发现地址相同,说明链表已经相交。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class Solution { public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode* curA = headA; ListNode* curB = headB; int lenA = 0, lenB = 0; while (curA != NULL) { lenA++; curA = curA->next; } while (curB != NULL) { lenB++; curB = curB->next; } curA = headA; curB = headB; if (lenB > lenA) { swap (lenA, lenB); swap (curA, curB); } int gap = lenA - lenB; while (gap--) { curA = curA->next; } while (curA != NULL) { if (curA == curB) { return curA; } curA = curA->next; curB = curB->next; } return NULL; } };
|