两个链表的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点。
O(m+n)
思路:首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个结点。在第二次遍历的时候,在较长的链表上先走若干步,接着再同时在两个链表上遍历,找到的第一个相同的结点就是它们的第一个公共结点。
1 struct ListNode 2 { 3 int val; 4 ListNode * next; 5 }; 6 7 int GetListLength( ListNode * head ) 8 { 9 int length = 0; 10 ListNode *tmp = head; 11 while( !tmp ) 12 { 13 ++length; 14 tmp = tmp->next; 15 } 16 return length; 17 } 18 19 ListNode * FindFirstCommonNode( ListNode * head1, ListNode * head2 ) 20 { 21 ListNode * result = NULL; 22 23 if( head1 == NULL || head2 == NULL ) 24 { 25 return result; 26 } 27 28 int Lhead1 = GetListLength( head1 ); 29 int Lhead2 = GetListLength( head2 ); 30 int LenD = Lhead1 - Lhead2; 31 ListNode * LongList = head1; 32 ListNode * ShortList = head2; 33 34 if( LenD < 0 ) 35 { 36 LongList = head2; 37 ShortList = head1; 38 LenD = -LenD; 39 } 40 41 for( int i = 0; i < LenD; ++i ) 42 { 43 LongList = LongList->next; 44 } 45 46 while( LongList != NULL && ShortList != NULL && LongList != ShortList ) 47 { 48 LongList = LongList->next; 49 ShortList = ShortList->next; 50 } 51 52 if( LongList == ShortList ) //判断是否有公共点 53 result = LongList; 54 55 return result; 56 }