160 相交鍊錶下的邏輯問題

2021-10-25 17:56:08 字數 1422 閱讀 7449

邏輯問題是怎麼判斷兩個鍊錶沒有交集。

力扣官方的思路是:

如果兩個鍊錶存在相交,它們末尾的結點必然相同。因此當 遍歷結點的指標pa/pb 到達鍊錶結尾時,記錄下鍊錶 a/b 對應的元素。若最後元素不相同,則兩個鍊錶不相交。

所以我的想法是記錄下兩個尾結點val的值,**如下:

/**

* definition for singly-linked list.

* struct listnode

* };

*/class solution

if(pb->next!=null) pb=pb->next;

else

if(a!=b)

}return pa;

}};

但始終返回的都是沒有交點,就是無論有沒有交點,程式必執行了return null;

我還沒有想明白的時候,看到了大佬的**,一開始覺得這沒有判斷鍊錶是否相交的情況,但我複製過來卻能夠順利提交。我煥然大悟我只是來地球湊數的。

看看碼

/**

* definition for singly-linked list.

* struct listnode

* };

*/class solution

return pa;

}};

while裡的這四句話,直覺告訴我,大佬偷工減料了,但其實另有玄機。

在第一次pa和pb到尾結點時,各自換成對方的頭結點,然後各自遍歷對方的鍊錶。如果他們有交點,那麼他們會在接下來同時到達這個結點,這時pa=pb,然後順利返回pa。但是!如果沒有交點,那他們也會同時到達兩個鍊錶尾節點之後的null結點,null和null是相等的!!!pa這時就返回的null,主函式就知道了這倆貨的人生壓根就沒有交集。真可憐,而指標自己卻不知道,還以為他們之間會發生點什麼。

完。不不不,再來說說為啥會等於null。

看看這個**

if(pa!=null) pa=pa->next;

else pa=headb;

當pa->next是null的時候,pa執行的是if,所以這時候pa變成了null,並且在下一次執行else之前都為null。

過程是:pa(last) —> null —> pa(headb)

當兩個指標第二次達到null的時候就是一起到達了,這是倆指標就相等了。

但應該還可以用乙個識別符號flag來判斷。

int flag=0;

while(pa!=pb&&flag<2)

if(pb!=null) pb=pb->next;

else pb=heada;

}if(flag=2) return null;

return pa;

當pa第三次到達頭結點,那必定不相交,跳出迴圈返回null。

160 相交鍊錶

編寫乙個程式,找到兩個單鏈表相交的起始節點。如下面的兩個鍊錶 在節點 c1 開始相交。示例 1 輸入 intersectval 8,lista 4,1,8,4,5 listb 5,0,1,8,4,5 skipa 2,skipb 3 輸出 reference of the node with valu...

160 相交鍊錶

題目描述 題目問題和難點 1.是找相交的那個節點,而不是值相等的節點。示例中1的值相同但不是相交的節點 2.此題目不考慮有環的鍊錶所以思路很簡單。public static listnode getintersectionnode listnode heada,listnode headb 1.獲取...

160相交鍊錶

題目描述 編寫乙個程式,找到兩個單鏈表相交的起始節點。沒有就返回null。注意 題解思路 從a鍊錶第乙個元素開始,去遍歷b鍊錶,找到乙個相同元素後,同步遍歷a和b鍊錶,所有元素相同,即兩個鍊錶為相交鍊錶,並返回同步遍歷的起始節點。struct listnode getintersectionnode...