The main idea of this solution is using the values of the intersecting nodes.

First, calculate the total amount of value of nodes in listB.

Second, add 1 to all the nodes in listA.

Third, re-calculate the total amount of value in listB.

If there exists some nodes intersecting, the re-calculated amount must be different from the previous one, otherwise, there is no any node intersecting. And we can also derive the first intersecting node through the difference between two amounts.

```
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *tmp = headB;
int amoutB = 0,lengthB=0;
//calculate the amount of values in listB and get the length of listB
while (tmp!=NULL)
{
amoutB += tmp->val;
lengthB ++;
tmp = tmp->next;
}
//add 1 value to all nodes in listA
tmp = headA;
while (tmp!=NULL)
{
tmp->val++;
tmp = tmp->next;
}
//re-calculate the amount of values in listB again
tmp = headB;
int newamoutB = 0;
while (tmp!=NULL)
{
newamoutB += tmp->val;
tmp = tmp->next;
}
tmp = headA;
//subtract 1 from all the nodes in listA
while (tmp!=NULL)
{
tmp->val--;
tmp = tmp->next;
}
//if two amounts are the same, there is no node intersecting
if(newamoutB==amoutB)
return NULL;
//the difference of two amounts means the number of intersecting nodes,
//we can get the first one by comparing it with number of nodes in listB
else
{
tmp = headB;
for(int i=0; i<lengthB-(newamoutB-amoutB);i++)
tmp = tmp->next;
return tmp;
}
}
```