1. 程式人生 > >【資料結構】連結串列相關練習題:判斷兩個連結串列是否相交

【資料結構】連結串列相關練習題:判斷兩個連結串列是否相交

編寫一個程式,找到兩個單鏈表相交的起始節點。

例如,下面的兩個連結串列

A:          a1 → a2
                   ↘
                     c1 → c2 → c3
                   ↗            
B:     b1 → b2 → b3

在節點 c1 開始相交。

注意:

  • 如果兩個連結串列沒有交點,返回 null.
  • 在返回結果後,兩個連結串列仍須保持原有的結構。
  • 可假定整個連結串列結構中沒有迴圈。
  • 程式儘量滿足 O(n) 時間複雜度,且僅用 O(1) 記憶體。
  • 思路分析:

這道題的思路是:先分別遍歷一遍連結串列,計算出兩個連結串列的長度,然後讓長的連結串列走他們的差距步,之後讓兩個連結串列的指標同時走,走到某個地方,若兩個連結串列相等時,就證明他們兩有交點。

  • 具體程式碼如下:
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{
    int lenA=0;
    int lenB=0;
    struct ListNode* curA=headA;
    struct ListNode* curB=headB;
    while(curA)
    {
        curA=curA->next;
        lenA++;
    }
    while(curB)
    {
        curB=curB->next;
        lenB++;
    }
    int gap=abs(lenA-lenB);
    struct ListNode* longList=headA,*shortList=headB;
    if(lenA<lenB)
        {
         longList=headB;
         shortList=headA;
        }
   while(gap--)   
       {
        longList=longList->next;
       }
    while(longList&&shortList)
    {
        if(longList->val==shortList->val)
        {
            return longList;
        }
        else
        {
            longList=longList->next;
            shortList=shortList->next;
        }
    }  
     return NULL;
}