两个链表的第一个公共结点

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

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 }

 

posted @ 2013-07-26 17:47  NinaGood  阅读(156)  评论(0编辑  收藏  举报