我正在编写一个函数来查找两个链表的交集。
我的第一个实现是这样的(advanceByK函数前进并且不返回值):
public ListNode getIntersectionNode(ListNode a, ListNode b) {
int aLen=findLength(a);
int bLen = findLength(b);
if(aLen==0 || bLen==0) return null;
ListNode aTemp = a, bTemp = b;
if(aLen>bLen) {
advanceByK(aTemp,aLen-bLen);
} else if(bLen > aLen) {
advanceByK(bTemp,bLen-aLen);
}
while((aTemp!=null) && (bTemp !=null)) {
if(aTemp.equals(bTemp))return aTemp;
aTemp = aTemp.next;
bTemp = bTemp.next;
}
return null;
}
public void advanceByK(ListNode head, int k) {
while(k>0) {
if(head!=null) head=head.next;
k--;
}
}
public int findLength(ListNode head) {
ListNode temp = head;
int res =0;
if(temp==null) return res;
while(temp!=null) {
res++;
temp = temp.next;
}
return res;
}
然后我改成了这个,就行了
public ListNode advanceByK(ListNode head, int k) {
while(k>0) {
if(head!=null) head=head.next;
k--;
}
return head;
}
我在这里做错了什么?
我知道Java是通过引用传递的,它应该已经将头移到了advanceByK函数中
答案 0 :(得分:1)
在第一个实现中,head
是对特定ListNode
对象的引用。如果要通过调用head
上的方法来对其进行修改,它的行为将与您期望的通过引用传递的方式相同。
但是,您所做的却是这样:
head=head.next;
这不会修改head
引用的对象中的任何状态。相反,它将更改本地ListNode
指向的head
。 ListNode
指向的原始head
保持不变。