兩個單鏈表相交的一系列問題
在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1 和 head2,這兩個鍊錶可能相交,也可能
不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點;如果不相交,返回 null 即可。
如果鍊錶 1 的長度為 n,鍊錶 2 的長度為 m,時間複雜度請達到 o(n+m),額外空間複雜度請達到 o(1)。(界定啊相交是記憶體位址相同)
方法:雜湊表(極簡單適用一切情況)依次遍歷,每遍歷乙個節點,將其加入雜湊表中,若遍歷到鍊錶最後乙個節點也沒有發現雜湊表中有之前已經記錄的節點,則表示鍊錶無環,若遍歷到某個節點發現雜湊表中已經存過這個節點,則表示有環,且這個節點是第乙個相交的節點。另一種方法,建立兩個指標,乙個快指標,乙個慢指標,慢指標依次遍歷鍊錶中每個節點,快指標跳步前進,每次走兩個節點,則這兩個指標一定會在環中相遇,當兩個指標相遇時,在鍊錶開頭再設定乙個指標,開頭的指標跟慢指標都繼續移動,每次一步,則兩個指標一定能在第乙個環節點相遇
乙個有環,乙個無環,不可能相交
兩個無環鏈表,可以相交,有兩種結構(「||」和「y」,不可能是「x」)不用雜湊表的方法:分別得到兩個鍊錶的長度,若乙個長度為50,乙個長度為40,則較長的鍊錶的指標先走10個節點,之後兩個鍊錶的指標同步前進,若出現某時刻兩個指標相等,則表示相交,即「y」,否則兩鍊錶結構是「||」
兩個鍊錶都有環:
兩個鍊錶各自都有環,沒有相交,即「66」結構
兩個鍊錶在環外相交,即yo
若兩個鍊錶的入環節點是同乙個,則表示是「yo」結構,則求第乙個相交節點與「y」情況解法相同
兩個鍊錶共享環,即||o
兩個鍊錶的指標,從頭開始,若node1走到自身的節點也沒有遇到node2,則表示兩個鍊錶無交點,是「66」結構,若兩個鍊錶的指標在遇到自身節點之前遇到了另乙個鍊錶的節點,則表示「||o」結構
public static class node
}public static node getintersectnode(node haed1,node head2)
node loop1 = getloopnode(head1);
node loop2 = getloopnode(head2);
if(loop1 == null && loop2 == null)
if(loop1 != null && loop2 != null)
return null;
}public static node getloopnode(node head)
node n1 = head.next; //n1為慢指標
node n2 = head.next.next; //n2為快指標
while(n1 != n2)
n2 = n2.next.next;
n1 = n1.next;
} n2 = head;
while(n1 != n2)
n2 = head; //n2 從頭重新開始走,且變為慢指標
while(n1 != n2)
return n1;
}public static node noloop(node head1, node head2)
node cur1 = head1;
node cur2 = head2;
int n = 0;
while(cur1.next != null)
while(cur2.next != null)
if(cur1 != cur2)
cur1 = n > 0 ? head1 : head2;
cur2 = cur1 == head1 ? head2 : head1;
n = math.abs(n);
while(n != 0)
while(cur1 != cur2)
return cur1;
}public static node bothloop(node head1, node loop1, node head2, node loop2)
while(cur2 != loop2)
return cur1;
}else
cur1 = cur1.next;
} return null;
}}
兩個單鏈表相交的一系列問題
在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1和head2,這兩個鍊錶可能相交,也可能不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回null 即可。要求 如果鍊錶1的長度為n,鍊錶2的長度為m,時間複雜度請達到 o n m 額外空間複雜度...
兩個單鏈表相交的一系列問題
兩個單鏈表相交的一系列問題 題目 在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1和head2,這兩個鍊錶可能相交,也可能不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回null 即可。要求 如果鍊錶1的長度為n,鍊錶2的長度為m,時間複雜度...
兩個單鏈表相交的一系列問題
題目 在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭結點head1和head2,這兩個鍊錶可能相交,也可能不相交,請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回null。要求 時間複雜度o n m 空間複雜度o 1 思路 第一步判斷鍊錶有無環 通過雜湊表 例如 ...