如何獲取兩條單向鏈表相交部分的起始節(jié)點
問題描述給定兩條單向無環(huán)鏈表,有兩種情況,一是兩條鏈表為兩條獨立無交點鏈表,另一種是兩條鏈表從某一交點開始剩余部分為公共相同的節(jié)點。編寫算法,對于第一個種情況,返回null,對于第二種情況,返回兩條
問題描述
給定兩條單向無環(huán)鏈表,有兩種情況,一是兩條鏈表為兩條獨立無交點鏈表,另一種是兩條鏈表從某一交點開始剩余部分為公共相同的節(jié)點。編寫算法,對于第一個種情況,返回null,對于第二種情況,返回兩條鏈表公共部分的起始節(jié)點。約束:時間復(fù)雜度為O(n*m),n和m為兩條鏈表的長度,空間復(fù)雜度為O(1)即原地操作,無需額外數(shù)據(jù)結(jié)構(gòu)輔助操作。
算法實現(xiàn)
通過以下步驟獲取兩條單向無環(huán)鏈表的相交段起始節(jié)點:
1. 聲明兩個指針,分別遍歷兩條鏈表,并記錄每條鏈表的最后一個節(jié)點;
2. 兩個指針遍歷完當(dāng)前鏈表后,互換,遍歷對方鏈表;
3. 如果兩個指針指向同一個節(jié)點,則為相交段起始節(jié)點;
4. 如果兩條鏈表最后一個節(jié)點不是同一個節(jié)點,則代表兩條鏈表不相交。
輔助函數(shù)
編寫一個函數(shù),將一條鏈表轉(zhuǎn)換為一個字符串,用于輔助本地測試。
本地測試
編寫本地測試主方法,并運(yùn)行本地測試,觀察控制臺輸出,確保輸出符合預(yù)期,本地測試通過。
示例代碼
```java
// 靜態(tài)內(nèi)部類表示鏈表節(jié)點
static class ListNode {
int val;
ListNode next;
public ListNode(int val) {
val;
null;
}
}
// 獲取兩條鏈表相交部分的起始節(jié)點
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA null || headB null) {
return null;
}
ListNode pA headA;
ListNode pB headB;
while (pA ! pB) {
pA pA null ? headB : ;
pB pB null ? headA : ;
}
return pA;
}
// 將鏈表轉(zhuǎn)換為字符串輔助函數(shù)
public String listToString(ListNode head) {
StringBuilder sb new StringBuilder();
ListNode current head;
while (current ! null) {
().append(" -> ");
current ;
}
("null");
return ();
}
// 本地測試主方法
public static void main(String[] args) {
Solution solution new Solution();
ListNode node1 new ListNode(1);
ListNode node2 new ListNode(2);
ListNode node3 new ListNode(3);
node2;
node3;
ListNode node4 new ListNode(4);
node2; // intersection point
((node1));
((node4));
ListNode result (node1, node4);
if (result ! null) {
("Intersection Node Value: " );
} else {
("No Intersection Node Found");
}
}
```
通過以上算法實現(xiàn)和測試代碼,可以有效獲取兩條單向鏈表相交部分的起始節(jié)點。