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

2021-08-15 12:24:26 字數 2938 閱讀 4597

在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1和head2,這兩個鍊錶可能相交,也可能不相交。請實現乙個函式, 如果兩個鍊錶相交,請返回相交的第乙個節點;如果不相交,返回null 即可。 要求:如果鍊錶1的長度為n,鍊錶2的長度為m,時間複雜度請達到 o(n+m),額外空間複雜度請達到o(1)

這是節點類

public static class node 

}

什麼是單鏈表有環?

有環,末尾不會是null節點,而是連線到自己,一直轉圈下去

無環,末尾是null節點

判斷有環無環,可以使用set集合,當遇見重複位址的時候判斷為有環,null為無環

//不使用set集合,設計兩個指標,快和慢,快的走兩步,慢的走一步,當快指標遇見null的時候為無環,當快指標遇見慢指標的時候,讓快指標從頭開始重新走,一步一步走,遇見慢指標的地方,為環節點

set集合方法過於簡單

這是第二種方法

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;

}

當結算出兩個節點有環還是無環後,可以分情況進行判斷

2個有無環

他們如果相交那麼必定是節點中有·同乙個,然後他們隻後的節點也會是同乙個。

然而乙個無環的和乙個有環的,是不會出現相交節點的,因為如果相交了,是不可能出現乙個有終點,乙個沒終點的

兩個無環的鍊錶,找相交節點,

如果最後的尾節點,不相等,可以判斷為不相交

①使用set集合,先新增進一條鍊錶再新增另一條鍊錶,遇見重複的節點就確定為相交節點。

②計算出兩條鍊錶的分別總長度,讓比較長的先走,長 - 短 長度 ,那麼他們一定可以在相交處相遇。

第一種情況,兩條鍊錶在結環之前就相遇了,他們的環節點是相同的。

我們可以忽略這個環,把結環的地方當成結束的地方,計算兩條鍊錶的分別總長度,讓長的先走  長 - 步  步 ,然後一起走,一定可以在相交的地方遇見(或者使用set集合,把結環之前的節點全部新增進去)

第二種情況

我們讓乙個環節點,走,只管走,如果能在轉完一圈前遇見 另乙個環節點,那麼就確定了相交節點,(這兩個環節點都可以當做相交節點)。如果轉完了一圈,那麼他們不相交

**

public class test17 	}	

public static void main(string args)

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 bothloop(node head1,node loop1,node head2,node loop2)

while(cur2.next!=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 node noloop(node head1,node head2)

while(cur2.next!=null)

if(cur1!=cur2)

//判斷 head1 和 head2誰比較靠長 讓比較長的鍊錶先走 (長鍊表長度-短鍊表長度) 步

cur1 = n>0? head1:head2;

cur2 = n>0? head2:head1;

n = math.abs(n);

while(n--!=0)

//讓他們碰到一起那個點就是交點

while(cur1!=cur2)

return cur1;

} public static node getloopnode(node head)

node slow = head.next;

node fast = head.next.next;

while(slow!=fast)

fast = fast.next.next;

slow = slow.next;

} fast=head;

while(fast!=slow)

return fast;

}}

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

兩個單鏈表相交的一系列問題 在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1 和 head2,這兩個鍊錶可能相交,也可能 不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回 null 即可。如果鍊錶 1 的長度為 n,鍊錶 2 的長度為 m,時...

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

兩個單鏈表相交的一系列問題 題目 在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1和head2,這兩個鍊錶可能相交,也可能不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回null 即可。要求 如果鍊錶1的長度為n,鍊錶2的長度為m,時間複雜度...

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

題目 在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭結點head1和head2,這兩個鍊錶可能相交,也可能不相交,請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回null。要求 時間複雜度o n m 空間複雜度o 1 思路 第一步判斷鍊錶有無環 通過雜湊表 例如 ...