Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
begin to intersect at node c1.
考虑错了一个问题:
只要两个开始指向同一个地址,那么后面的肯定就相同了。有兴趣的可以画一下,比如同时指向C1,假设后面的不同,那么C1就需要指向两个不同的地方,但是C1的NEXT只有一个。
思路:
(1)首先对齐链表,将长的去头,因为相交不可能在前面,道理和前面一样,如果前面一样了,那么后面肯定一样。
(2)然后两两对比,直到找到相同的点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
int lenA = 0, lenB = 0;
ListNode* tempA = headA;
ListNode* tempB = headB;
while(tempA != NULL)
{
tempA = tempA->next;
++lenA;
}
tempA = headA;
while(tempB != NULL)
{
tempB = tempB->next;
++lenB;
}
tempB = headB;
if (lenA > lenB)
for (int i = 0; i < lenA - lenB; ++i)
tempA = tempA->next;
if (lenB > lenA)
for (int i = 0; i < lenB - lenA; ++i)
tempB = tempB->next;
while(tempA != tempB)
{
tempA = tempA->next;
tempB = tempB->next;
}
return tempA;
}
};