給定兩個單鏈表,查找這兩個單鏈表的交叉節點。例如:鏈表listA爲:a1→a2→c1→c2→c3,鏈表listB爲:b1→b2→b3→c1→c2→c3。那麼這兩個的第一個交叉節點爲c1。c++
首先,觀察一下交叉節點的特色。若是兩個鏈表有交叉節點的話,那麼這個交叉節點以後的其餘節點都是相同的,也就是說兩個鏈表的結構應該是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 }