BM10. 两个链表的第一个公共结点
描述
输入描述
输入分为是3段,第一段是第一个链表的非公共部分,第二段是第二个链表的非公共部分,第三段是第一个链表和第二个链表的公共部分。 后台会将这3个参数组装为两个链表,并将这两个链表对应的头节点传入到函数FindFirstCommonNode里面,用户得到的输入只有pHead1和pHead2。输出描述
返回传入的pHead1和pHead2的第一个公共结点,后台会打印以该节点为头节点的链表。示例1
输入:
{1,2,3},{4,5},{6,7}
输出:
{6,7}
说明:
第一个参数{1,2,3}代表是第一个链表非公共部分,第二个参数{4,5}代表是第二个链表非公共部分,最后的{6,7}表示的是2个链表的公共部分 这3个参数最后在后台会组装成为2个两个无环的单链表,且是有公共节点的示例2
输入:
{1},{2,3},{}
输出:
{}
说明:
2个链表没有公共节点 ,返回null,后台打印{}C 解法, 执行用时: 2ms, 内存消耗: 328KB, 提交时间: 2020-09-07
/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * * @param pHead1 ListNode类 * @param pHead2 ListNode类 * @return ListNode类 */ int findListLength(struct ListNode *pHead1) { if(pHead1==NULL) return 0; int sum=1; while(pHead1=pHead1->next) sum++; return sum; } struct ListNode* walkStep(struct ListNode *pHead1,int step){ while(step--) { pHead1=pHead1->next; } return pHead1; } struct ListNode* FindFirstCommonNode(struct ListNode* pHead1, struct ListNode* pHead2 ) { // write code here int len1=findListLength(pHead1); int len2=findListLength(pHead2); if(len1>len2) pHead1=walkStep(pHead1, len1-len2); else pHead1=walkStep(pHead1, len1-len2); while(pHead1 != NULL){ if(pHead1 == pHead2) return pHead1; pHead1 = pHead1->next; pHead2 = pHead2->next; } return NULL; }
C 解法, 执行用时: 2ms, 内存消耗: 340KB, 提交时间: 2021-03-21
/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * * @param pHead1 ListNode类 * @param pHead2 ListNode类 * @return ListNode类 */ struct ListNode* FindFirstCommonNode(struct ListNode* pHead1, struct ListNode* pHead2 ) { // write code here struct ListNode *p=pHead1; struct ListNode *q=pHead2; while(p!=q) { p = p ? p->next : pHead2; q = q ? q->next : pHead1; } return p; }
C 解法, 执行用时: 2ms, 内存消耗: 340KB, 提交时间: 2020-09-06
/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * * @param pHead1 ListNode类 * @param pHead2 ListNode类 * @return ListNode类 */ struct ListNode* FindFirstCommonNode(struct ListNode* pHead1, struct ListNode* pHead2 ) { // write code here struct ListNode *p1 = pHead1, *p2 = pHead2; while(p1 != p2) { p1 = p1 ? p1->next : pHead2; p2 = p2 ? p2->next : pHead1; } return p1; }
C 解法, 执行用时: 2ms, 内存消耗: 340KB, 提交时间: 2020-08-30
/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * * @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; } struct ListNode *p1, *p2; p1 = pHead1; p2 = pHead2; while (p1 != p2) { p1 = (p1 == NULL ? pHead1 : p1->next); p2 = (p2 == NULL ? pHead2 : p2->next); } return p1; }
C 解法, 执行用时: 2ms, 内存消耗: 344KB, 提交时间: 2021-03-17
/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * * @param pHead1 ListNode类 * @param pHead2 ListNode类 * @return ListNode类 */ struct ListNode* FindFirstCommonNode(struct ListNode* pHead1, struct ListNode* pHead2 ) { // write code here struct ListNode *res = NULL, *record_1[888], *record_2[888]; int idx_1 = 0, idx_2 = 0; while(pHead1 && pHead2) { record_1[ idx_1++ ] = pHead1; record_2[ idx_2++ ] = pHead2; int i = idx_1-1, j = idx_2-1; while(i >= 0) { if(record_1[ i-- ] == pHead2) return pHead2; if(record_2[ j-- ] == pHead1) return pHead1; } pHead1 = pHead1->next; pHead2 = pHead2->next; } char flag = 0; if(pHead1){ do{ int j = idx_2-1; while(j >= 0) if(record_2[ j-- ] == pHead1){ res = pHead1; flag = 1; break; } if(flag) break; }while(pHead1 = pHead1->next); } else if(pHead2){ do{ int i =idx_1-1; while(i >= 0) if(record_1[ i-- ] == pHead2){ res = pHead2; flag = 1; break; } if(flag) break; }while(pHead2 = pHead2->next); } return res; }