C代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
// 如果headA==NULL 或者 headB==NULL,则两链表不相交
if(!headA || !headB) return NULL;
struct ListNode *ptrA = headA, *ptrB = headB;
// 循环终止条件是ptrA == ptrB,有4种情况
// (1)同时到达第一个公共节点,
// 1.1 A和B相交,且len(A)==len(B),则ptrA和ptrB在遍历各自原本的链表时,同时到达第一个公共节点
// 1.1 A和B相交,且len(A)!=len(B),则ptrA和ptrB在遍历完各自原本的链表后,在遍历对方的链表时,同时到达第一个公共节点
// 2,同时到达链表末端,值为NULL
// 2.1 A和B不相交,且len(A)==len(B),则ptrA和ptrB在遍历各自原本的链表时,同时到达尾端,值为NULL
// 2.2 A和B不相交,且len(A)!=len(B),则ptrA和ptrB在遍历完各自原本的链表后,在遍历对方的链表时,同时到达尾端,值为NULL
while( ptrA != ptrB)
{
// 优先级: 条件运算符?: 大于 赋值号=
// ptrA先遍历自身节点,如果遍历到末端ptrA==NULL时,开始遍历另一链表B
ptrA = !ptrA ? headB : ptrA->next;
// ptrB先遍历自身节点,如果遍历到末端ptrB==NULL时,开始遍历另一链表A
ptrB = !ptrB ? headA : ptrB->next;
}
return ptrA;
}