返回信息流题目如上,代码在9楼
其中有个test case是这样的
这个input啥意思啊??
-------------分割线--------------
这题应该就是不给显示input,不过从output中可以大致推断出问题是,应该在第一个结点重合的,结果却输出的是第二个结点。
顺着这个思路我将代码调试了一下(代码在9楼),发现如果当其中一个链表是从头结点开始重合的,那么从后往前比较的过程中,指针永远只能指到第二个结点,而无法指向第一个。
对此我做了简要修改,代码就能AC了,while(pA1 != null)这句改为while(pA1 != null && lenA!=2),表示当lenA只剩2时,无需再进入循环体让pA1跳到下一个结点了。对while(pB1 != null)也相应修改为while(pB1 != null && lenB!=2)
这题我考虑的有点多,觉得如果要看是否重合,那么除了相遇的结点,后面的每个结点也要比较。
但是10楼和6楼的大神说只要得到相遇的结点即可,发现确实可以,在此感谢两位热心的大神,获益良多
这是一条镜像帖。来源:北邮人论坛 / java / #53708同步于 2016/11/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
(已解决 )Leetcode 160题求助
z3278221
2016/11/4镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
考虑了呀,我第一句就写的if(headA==null || headB==null) return null;。但是这个testcase的input是none是什么鬼
【 在 NachtZ 的大作中提到: 】你有没有考虑到输入是空的情况。
LZ,我调试了一下,确实不会显示Input。
不知道怎么贴图上去,我文字描述一下吧。
我在最后一行return这么写:
```cpp
return p==NULL?p:headA;
```
这样肯定会返回非空的,因为headA我在开头用NULL判定过滤了,所以headA一定非空。那么我提交的时候,返回这个结果:
```
Input:
Output:
Intersected at '1'
Expected:
Intersected at '2'
```
终于发现则插图了……
然后我的CPP代码:
```cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(!headA||!headB)
return NULL;
ListNode* p=headA;
ListNode* q=headB;
int lenA(0),lenB(0);
while(p!=NULL){
p=p->next;
lenA++;
}
while(q!=NULL){
q=q->next;
lenB++;
}
if(lenA==0||lenB==0)
return NULL;
p=headA;
q=headB;
if(lenA>lenB){
for(int i=0;i<lenA-lenB;i++)
p=p->next;
}
else if(lenA<lenB){
for(int i=0;i<lenB-lenA;i++)
q=q->next;
}
while(p!=q){
p=p->next;
q=q->next;
}
return p;
}
};
```
大概这样,嗯。
要不上个代码看看。
【 在 z3278221 的大作中提到: 】
: 考虑了呀,我第一句就写的if(headA==null || headB==null) return null;。但是这个testcase的input是none是什么鬼
思路:想得到重合的部分,从末尾往前开始比较
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
public class Solution{
public static ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null)
return null;
int lenA = 1 , lenB = 1;
ListNode pA1 = headA , pA2 = headA , pB1 = headB , pB2 = headB;
//lenA得到A链表的长度,lenB得到B链表的长度,pA2指针指向A链表末尾,pB2指向B链表末尾
while(pA2 != null && pA2.next!= null){
lenA ++;
pA2 = pA2.next;
}
while(pB2 != null && pB2.next!= null){
lenB ++;
pB2 = pB2.next;
}
//先比较两个链表的尾结点,如果不相等,那么就无需再比较了。反之,如果相等,那么pA2和pB2就暂时成为重合部分的头
if(pA2.val != pB2.val)
return null;
//在尾结点相等的情况下,依次比较俩链表前一个结点
while(lenA>1 && lenB >1){
int count = 0; //count作为一个计步器
while(pA1 != null){
pA1 = pA1.next; //每次都让pA1从前往后走
count ++;
if(count >= lenA-2) //当pA1走到后面要进行比较的结点时,结束A链表中的指针走动
break;
}
count = 0; //同理
while(pB1 != null){
pB1 = pB1.next;
count ++;
if(count >= lenB-2)
break;
}
if(pA1.val == pB1.val){ //pA1和pA2指针都已经走到要比较的结点处,如果它们相等,那么重合部分的头(pA2和pB2都行,这里取pA2)指向pA1现在所在的位置
pA2 = pA1;
pA1 = headA; //pA1和pB1回归到链表头,以便下一次循环
pB1 = headB;
}else
return pA2; //如果不相等,那么重合部分的头还是之前的pA2的位置,返回即可
//每循环一次将链表长度减一,因为下次循环需要比较前一个结点了
lenA --;
lenB --;
}
return pA2;
}
}
【 在 NachtZ 的大作中提到: 】
: 要不上个代码看看。