您的位置:首页 > Web前端

剑指offer(33)-两个链表的第一个公共结点

2016-06-17 17:30 405 查看

题目描述

输入两个链表,找出它们的第一个公共结点。

 代码

/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {
// 得到两个链表的长度
unsigned int nLength1 = GetListLength(pHead1);
unsigned int nLength2 = GetListLength(pHead2);

int nLengthDif = nLength1 - nLength2;

ListNode *pListHeadLong = pHead1;
ListNode *pListHeadshort = pHead2;
if (nLength2 > nLength1)
{
pListHeadLong = pHead2;
pListHeadshort = pHead1;
nLengthDif = nLength2 - nLength1;
}

// 先在长链表上走几步,再同时在两个链表上遍历
for (int i = 0; i < nLengthDif; ++i)
{
pListHeadLong = pListHeadLong->next;
}

while((pListHeadLong != NULL) && (pListHeadshort != NULL) && (pListHeadLong != pListHeadshort)) {
pListHeadshort = pListHeadshort->next;
pListHeadLong = pListHeadLong->next;
}

// 得到第一个公共节点
ListNode *pFirstCommonNode = pListHeadLong;
return pFirstCommonNode;
}

// 获取链表的长度
unsigned int GetListLength(ListNode *pHead)
{
unsigned int nLength = 0;
ListNode *pNode = pHead;
while(pNode != NULL) {
nLength ++;
pNode = pNode->next;
}
return nLength;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表