/** * struct ListNode { * int val; * struct ListNode *next; * }; */ //方法一: //判断是否有空链表,有则返回空 //接着首先遍历两个链表的节点数n1,n2 //然后比较节点数大小,做差为K //长链表跑到第k个点 //然后两个链表再同时跑 //判断是否有相同的节点且不为null //方法二: //判断是否有空,则输出空 //利用跑环法:即假设链表pHead1长度为L1+C,链表pHead2长度为L2+C,那么双方只要各自跑L1+L2+C的路程,两者就会相遇 //利用while循环判断跑环过程中指针p1和指针p2指向的节点是否相同, //它们相同时可能:在链中或为NULL /** * * @param pHead1 ListNode类 * @param pHead2 ListNode类 * @return ListNode类 */ struct ListNode* FindFirstCommonNode(struct ListNode* pHead1, struct ListNode* pHead2 ) { // write code here. //方法二 //判断是否有空,则输出空 if(pHead1 == NULL || pHead2 == NULL) { return NULL; } //利用跑环法:即假设链表pHead1长度为L1+C,链表pHead2长度为L2+C,那么双方只要各自跑L1+L2+C的路程,两者就会相遇 //先定义两个指针,方便移动 struct ListNode *p1 = pHead1; struct ListNode *p2 = pHead2; //利用while循环判断跑环过程中指针p1和指针p2指向的节点是否相同, //它们相同时可能:在链中或为NULL while(p1!=p2) { p1 = p1==NULL?pHead2:p1->next; //三目运算符,p1==NULL条件成立,p1=pHead2, 否则p1=p1->next p2 = p2==NULL?pHead1:p2->next; } return p1; }