【資料結構】連結串列相關練習題:判斷兩個連結串列是否相交
阿新 • • 發佈:2018-12-16
編寫一個程式,找到兩個單鏈表相交的起始節點。
例如,下面的兩個連結串列:
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; }