在本題中,單鏈表可能有環,或者無環。給定兩個單鏈表的頭結點head1和head2,這兩個鍊錶可能相交也可能不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點;如果不相交,返回null。空間複雜度為o(1)
如果不限制額外空間複雜度,那麼遍歷單鏈表1,將所有值放入hashset中,再依次遍歷單鏈表2,如果鍊錶2的在hashset中發現有重複值,那麼這個節點為相交節點。遍歷結束,沒有在集合中發現相同值,返回null。列舉單鏈表的3種情況
兩個鍊錶均無環
乙個有環,乙個無環
兩個都有環
先相交,之後成環
不相交有公共環。(這種情況:∀)
如何判斷單鏈表是否有環:【鍊錶中環的入口節點】
如果兩個鍊錶均無環
對兩個鍊錶從頭到尾遍歷,求得鍊錶長度和尾結點
比較兩個尾結點,尾結點不相等,不相交。
尾結點相等,求出兩個鍊錶的長度差count。
長鍊表先走count步,再一起走,相等的時候即為相交節點。
如果兩個鍊錶都有環
拿到每個環的頭結點head1、head2和入環節點loop1、loop2
比較loop1和loop2是否相等。當loop1==loop2的時候,說明是先相交後成環,可以砍去這個環,問題轉化成兩個鍊錶的尋找相遇節點問題
從loop1處向後遍歷,直到再次回到loop1的時候,中間沒有任何節點等於loop2的節點,則說明兩個環不相交。否則,返回相交節點。
**實現
public
class
findfirstintersectnode
}public
static node getintersectnode
(node head1, 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 -> slow
node n2 = head.next.next;
// n2 -> fast
while
(n1 != n2)
n2 = n2.next.next;
n1 = n1.next;
} n2 = head;
// n2 -> walk again from head
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)
cur1 = n >
0? head1 : head2;
cur2 = cur1 == head1 ? head2 : head1;
n = math.
abs(n)
;while
(n !=0)
while
(cur1 != cur2)
return cur1;
}else
cur1 = cur1.next;
}return null;}}
public
static
void
main
(string[
] args)
}
兩個單鏈表相交的一系列問題
兩個單鏈表相交的一系列問題 在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1 和 head2,這兩個鍊錶可能相交,也可能 不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回 null 即可。如果鍊錶 1 的長度為 n,鍊錶 2 的長度為 m,時...
兩個單鏈表相交的一系列問題
在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1和head2,這兩個鍊錶可能相交,也可能不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回null 即可。要求 如果鍊錶1的長度為n,鍊錶2的長度為m,時間複雜度請達到 o n m 額外空間複雜度...
兩個單鏈表相交的一系列問題
兩個單鏈表相交的一系列問題 題目 在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1和head2,這兩個鍊錶可能相交,也可能不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回null 即可。要求 如果鍊錶1的長度為n,鍊錶2的長度為m,時間複雜度...