输入两个链表,找出他们的第一个公共结点。
链表结点定义如下:
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 }