邏輯問題是怎麼判斷兩個鍊錶沒有交集。
力扣官方的思路是:
如果兩個鍊錶存在相交,它們末尾的結點必然相同。因此當 遍歷結點的指標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...