题目:给定两个链表的头结点,求两个链表的公共长度。
分析:
1. 两个链表无非就两种关系(其它特殊关系都可以看成是这两种的特殊关系)
(1)不相交:
(2)相交:
2. 对于第一种情况,两个链表不相交则公共长度为0。第二种情况是从第一个公共结点之后所有点都是公共的,因此可以求出公共长度。
3. 怎么求两个链表公共长度呢?
假设链表1的长度为n,链表2的长度为m,并且满足n > m。我们可以设置两个指针p1,p2开始指向链表1和链表2的头结点,并且让p1先走几步使得链表1剩下的长度等于链表2。然后再同时让两个指针p1,p2一起走,判断有没有公共结点,若有从第一个公共结点开始直到链表末尾都是公共结点。
整个算法的时间复杂度为O(2*(n+m)),所以总的就是O(n)级别。
4. 代码
//链表结点 struct ListNode{ int value; ListNode *nextNode; }; //求链表的长度 int GetListLength(ListNode *headNode){ //空链表返回0 if(headNode == NULL){ return 0; } ListNode *tmpNode = headNode; int length = 0; while(tmpNode != NULL){ ++length; tmpNode = tmpNode->nextNode; } return length; } //求两个链表的公共长度 int GetCommonLength(ListNode *headOne, ListNode *headTwo){ //不合法数据 if(headOne == NULL || headTwo == NULL){ return 0; } //先求出两个链表的长度 ListNode *tmpHeadOne = headOne; ListNode *tmpHeadTwo = headTwo; int listOneLength = GetListLength(tmpHeadOne); int listTwoLength = GetListLength(tmpHeadTwo); //让长的链表先走几步 if(listOneLength > listTwoLength){ while(listOneLength > listTwoLength){ tmpHeadOne = tmpHeadOne->nextNode; --listOneLength; } } else{ while(listTwoLength > listOneLength){ tmpHeadTwo = tmpHeadTwo->nextNode; --listTwoLength; } } //求公共长度 int commonLength = 0; while(tmpHeadOne != NULL && tmpHeadTwo != NULL){ //指向同一个结点,地址相同 if(tmpHeadOne == tmpHeadTwo){ ++commonLength; } tmpHeadOne = tmpHeadOne->nextNode; tmpHeadTwo = tmpHeadTwo->nextNode; } return commonLength; }
时间: 2024-10-06 03:26:24