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

2021-09-01 06:37:13 字數 2791 閱讀 5616

在本題中,單鏈表可能有環,也可能無環。給定兩個單鏈表的頭節點 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 額外空間複雜度...