在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 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 思路 第一步判斷鍊錶有無環 通過雜湊表 例如 ...