输入两个链表,找出他们的第一个公共结点。
链表结点定义如下:
1 struct ListNode
2 {
3 int m_nValue;
4 ListNode* m_pNext;
5 }
思想:我们可以先遍历一次得到分别得到两个链表的长度,然后计算得出长度差n,那么让较长的链表先走n步,然后两个链表一起向后走,直到两个指针指向同一个结点。这个结点就是我们要找的
结点。具体代码如下:
1 int GetListLength(ListNode* pHead)
2 {
3 int length = 0 ;
4 while (pHead != NULL)
5 {
6 length++ ;
7 pHead = pHead->m_pNext ;
8 }
9 return length ;
10 }
11
12 ListNode* FindFirstCommonNode(ListNode* pHead1 , ListNode* pHead2)
13 {
14 int nLength1 = GetListLength(pHead1) ;
15 int nLength2 = GetListLength(pHead2) ;
16 int LengthDiff = nLength1 - nLength2 ;
17
18 ListNode* pLongListHead = pHead1;
19 ListNode* pShortListHead = pHead2 ;
20 if (LengthDiff < 0)
21 {
22 LengthDiff = - LengthDiff ;
23 pLongListHead = pHead2;
24 pShortListHead = pHead1 ;
25 }
26 for (int i = 0 ; i < LengthDiff ; i++)
27 {
28 pLongListHead = pLongListHead->m_pNext;
29 }
30
31 while (pLongListHead != NULL && pShortListHead != NULL && pLongListHead != pShortListHead)
32 {
33 pLongListHead = pLongListHead->m_pNext;
34 pShortListHead = pShortListHead->m_pNext;
35 }
36
37 ListNode* pFirstCommonNode = pLongListHead ;
38 return pFirstCommonNode;
39 }
时间: 2024-11-08 11:10:02