查找兩個鏈表的共同子鏈表

注:基於jeanphorn‘s csdn文章進行修改而成。

1. 問題描述

  給定兩個單鏈表,查找這兩個單鏈表的交叉節點。例如:鏈表listA爲:a1a2c1c2c3,鏈表listB爲:b1b2b3c1c2c3。那麼這兩個的第一個交叉節點爲c1c++

2. 方法與思路

  首先,觀察一下交叉節點的特色。若是兩個鏈表有交叉節點的話,那麼這個交叉節點以後的其餘節點都是相同的,也就是說兩個鏈表的結構應該是Y字型的。atom

 

也就是說,c1以後的節點都是交叉節點。下面的問題就是如何肯定c1這個節點,咱們能夠設兩個指針分別遍歷兩個鏈表,而後對比節點的值,可是兩個鏈表多是不等長的,咱們能夠先讓長度較大的鏈表指針先走|len(listA)len(listB)|步,而後在同步進行。 
      時間複雜度O(n+m+n)(注:n爲較長的鏈表的長度,m爲較短的鏈表的長度),空間複雜度O(1)
spa

c++代碼以下:.net

 1     //求出鏈表長度
 2     int getListLength(ListNode *head)
 3     {
 4         int len = 0;
 5         ListNode *tmp = head;
 6         while(tmp){
 7            tmp = tmp->next;
 8            len++;
 9         }
10         return len;
11     }
12     //判斷交叉節點
13     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
14         ListNode *a = headA, *b = headB;
15 
16         int ab  = getListLength(a)-getListLength(b);
17 
18         if(ab > 0)
19         {
20             while(ab) a = a->next, ab--;
21         }
22         else if(ab < 0)
23         {
24             while(ab) b = b->next, ab++;
25         }
26 
27         while(a && b)
28         {
29             if(a->val == b->val) return a;
30 
31             a = a->next;
32             b = b->next;
33         }
34 
35         return NULL;
36     }
相關文章
相關標籤/搜索