在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1和head2,這兩個鍊錶可能相交,也可能不相交。請實現乙個函式, 如果兩個鍊錶相交,請返回相交的第乙個節點;如果不相交,返回null 即可。 要求:如果鍊錶1的長度為n,鍊錶2的長度為m,時間複雜度請達到 o(n+m),額外
空間複雜度請達到o(1)
分析:1、首先判斷兩個單鏈表l1,l2是否有環,並返回入環結點
思路是:快慢指標思想,從head開始,快指標一次走兩步,慢指標一次走一步,如果快指標走到null,說明無環,否則有環,快慢指標必會在環上相遇,此時快指標回到頭結點,慢指標留在原地,二者同時每次走一步,相遇點即是入環結點。若有環,返回l1,l2的入環結點loop1,loop2
2、有三種情況:(1)兩個都無環,(2)一有環一無環,(3)兩個都有環
情況(1)兩個都無環:
如何找到第乙個相交點?:分別從l1,l2走到尾結點end,計算各自長度,然後回到頭結點,較長的鍊錶先走兩表的長度差步,之後兩個再一起走,相遇時返回相遇點
情況(2)一有環一無環
這種情況很明顯不可能相交,否則就不是單鏈表了。
情況(3)兩個都有環:
相交(1)如何找到第乙個相交點:模仿情況(1)無環的做法
相交(2)如何找到第乙個相交點:利用第一部返回的loop1,loop2,從loop1開始,每次往下走一步,若能遇到loop2,則屬於相交(2)這種情況,那麼第乙個相交點就是loop1或者loop2(這裡我們選擇loop1好了)
public static class node
}
public
static node getintersectnode
(node head1, node head2)
//getloopnode方法獲得入環結點loop1,loop2,
node loop1 =
getloopnode
(head1)
; node loop2 =
getloopnode
(head2);if
(loop1 ==
null
&& loop2 ==
null)if
(loop1 !=
null
&& loop2 !=
null
)return
null
;//一有環一無環不可能相交,返回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;
}//無環時呼叫noloop方法
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;
//令cur1為較長的鍊錶的head
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
;//否則就是不相交
}}
兩個單鏈表相交問題
關於兩個鍊錶相交,很容易遷移到好多地方,比如 1.找出兩個鍊錶相交的節點 2.判斷單個鍊錶是否有環等 3.二叉樹當存在父指標的時候,求樹中兩個節點的最近公共祖先 看乙個圖 一下只給出相當一部分思想 方法一 將兩個鍊錶的節點進行hash操作,然後判斷出節點,這種想法是可以的。方法二 當然採用暴力的方法...
兩個單鏈表相交的一系列問題
兩個單鏈表相交的一系列問題 在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1 和 head2,這兩個鍊錶可能相交,也可能 不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回 null 即可。如果鍊錶 1 的長度為 n,鍊錶 2 的長度為 m,時...
兩個單鏈表相交的一系列問題
在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 head1和head2,這兩個鍊錶可能相交,也可能不相交。請實現乙個函式,如果兩個鍊錶相交,請返回相交的第乙個節點 如果不相交,返回null 即可。要求 如果鍊錶1的長度為n,鍊錶2的長度為m,時間複雜度請達到 o n m 額外空間複雜度...