重難點 兩個單鏈表相交的一系列問題

2021-10-04 16:30:28 字數 2550 閱讀 3898

在本題中,單鏈表可能有環,或者無環。給定兩個單鏈表的頭結點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,時間複雜度...