题目
编写一个程序,找到两个单链表相交的起始节点
注意:
- 如果两个链表没有交点,返回 null.
- 在返回结果后,两个链表仍须保持原有的结构。
- 可假定整个链表结构中没有循环。
- 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
思路
架设存在两个链表 headA headB。定义两个指针 a b分别对应headA headB, 循环a b 直至到达链表的尾部,然后将a指向headB、将b指向headA ,继续循环直至出现a==b的情况,或者任意一个链表到达终点。
代码
| 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 39 40 41 42 43 44 45 46 47
 |  * Definition for singly-linked list.  * struct ListNode {  *     int val;  *     struct ListNode *next;  * };  */ struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {     struct ListNode *a = headA;     struct ListNode *b = headB;     int aDone =0;     int bDone =0;     while(1)     {         if(a == b) {             return a;         }         if(a && a->next) {             a =  a->next;         } else {             if(aDone != 1) {                a = headB;                aDone = 1;              } else {                 break;             }                      }                   if(b && b->next )         {             b = b->next;         } else {             if(bDone != 1) {                 b = headA;                 bDone =1;             } else {                 break;             }                      }              }     return NULL;          }
 |