问题:已知两个单链表有交叉节点,计算它们的第一个交叉节点。
https://www.cnblogs.com/yorkyang/p/10876604.html
1 //求出单链表的长度
2 int getListLength(ListNode *head)
3 {
4 int len = 0;
5 ListNode *tmp = head;
6 while(tmp){
7 tmp = tmp->next;
8 ++len;
9 }
10 return len;
11 }
12 //判断两个单链表的第一个交叉节点
13 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
14 ListNode *a = headA, *b = headB;
15
16 int ab = getListLength(a)-getListLength(b);
17 ///< 裁掉其中的较长单链表的前缀多出来的部分
18 if(ab > 0)
19 {
20 while(ab) {a = a->next, ab--;}
21 }
22 else if(ab < 0)
23 {
24 while(ab) {b = b->next, ab++;}
25 }
26 ///< 至此,两个单链表的以a打头和以b打头的子链表的长度是一样的,各自递增一步比较对应元素值是否一样;
27 while(a && b)
28 {
29 if(a->val == b->val) return a;
30
31 a = a->next;
32 b = b->next;
33 }
34
35 return nullptr;
36 }