您的位置:首页 > 其它

【32】计算两个链表的公共长度

2014-06-13 08:54 253 查看
题目:给定两个链表的头结点,求两个链表的公共长度。

分析:
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐