1. 程式人生 > >查詢兩個連結串列的交叉節點

查詢兩個連結串列的交叉節點

1. 問題描述

  給定兩個單鏈表,查詢這兩個單鏈表的交叉節點。例如:連結串列listA為:a1a2c1c2c3,連結串列listB為:b1b2b3c1c2c3。那麼這兩個的第一個交叉節點為c1

2. 方法與思路

  首先,觀察一下交叉節點的特點。如果兩個連結串列有交叉節點的話,那麼這個交叉節點之後的其他節點都是相同的,也就是說兩個連結串列的結構應該是Y字型的。
  feature
  
  也就是說,c1之後的節點都是交叉節點。下面的問題就是如何確定c1這個節點,我們可以設兩個指標分別遍歷兩個連結串列,然後對比節點的值,但是兩個連結串列可能是不等長的,我們可以先讓長度較大的連結串列指標先走|

len(listA)len(listB)|步,然後在同步進行。
  時間複雜度O(n),空間複雜度O(1)
  c++程式碼如下:
  

    //求出連結串列長度
    int getListLength(ListNode *head)
    {
        int len = 0;
        ListNode *tmp = head;
        while(tmp) tmp = tmp->next,len++;

        return len;
    }
    //判斷交叉節點
    ListNode *getIntersectionNode(ListNode *headA
, ListNode *headB) { ListNode *a = headA, *b = headB; int ab = getListLength(a)-getListLength(b); if(ab > 0) { while(ab) a = a->next, ab--; } else if(ab < 0) { while(ab) b = b->next, ab++; } while
(a && b) { if(a->val == b->val) return a; a = a->next; b = b->next; } return NULL; }