首页 > 代码库 > 剑指offer (37) 两个链表的第一个公共结点
剑指offer (37) 两个链表的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点
如果两个链表有公共结点,那么公共结点一定出现在两个链表的尾部
如果两链表长度不相等,那么达到公共结点的步数就不一致,如何确保 两个链表从头开始遍历,同步达到公共结点? 这是关键所在
如果两链表长度相同,那么就可以同步达到了? 由此,我们就需要 让两个链表长度"相等"
我们假设 两链表长度分别为m和n,且m > n, 那么我们可以在较长链表中 先走 m - n 步,然后 两个链表游标同步走,如果有公共结点,那么就一定同时达到
ListNode* FirstCommonNode(ListNode* list1, ListNode* list2){ if (list1 == NULL || list2 == NULL) return NULL; ListNode* cur1 = list1; ListNode* cur2 = list2; int list1Len = 0; int list2Len = 0; while (cur1++ != NULL) { ++list1Len; } while (cur2++ != NULL) { ++list2Len; } int maxLen = std::max(list1Len, list2Len); ListNode* longerList = NULL; ListNode* shorterList = NULL; int gap = 0; if (maxLen == list1Len) { longerList = list1; shorterList = list2; gap = maxLen - list2Len; } else { longerList = list2; shorterList = list1; gap = maxLen - list1Len; } int firstStep = 0; while (firstStep != gap) { longerList = longerList->next; ++firstStep; } while (longerList != NULL && shorterList != NULL) { if (longerList == shorterList) { return longerList; } else { longerList = longerList->next; shorterList = shorterList->next; } } return NULL;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。