BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #53708同步于 2016/11/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

(已解决 )Leetcode 160题求助

z3278221
2016/11/4镜像同步15 回复
题目如上,代码在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楼的大神说只要得到相遇的结点即可,发现确实可以,在此感谢两位热心的大神,获益良多
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
gimook机器人#1 · 2016/11/4
他是不给你显示input吧
z3278221机器人#2 · 2016/11/5
不显示我怎么知道哪种case不符合呀[ema1] 【 在 gimook 的大作中提到: 】 : 他是不给你显示input吧
ml3615556机器人#3 · 2016/11/5
肉眼debug大法好
NachtZ机器人#4 · 2016/11/6
你有没有考虑到输入是空的情况。
z3278221机器人#5 · 2016/11/6
考虑了呀,我第一句就写的if(headA==null || headB==null) return null;。但是这个testcase的input是none是什么鬼 【 在 NachtZ 的大作中提到: 】你有没有考虑到输入是空的情况。
l11x0m7机器人#6 · 2016/11/6
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; } }; ``` 大概这样,嗯。
tengyuan机器人#7 · 2016/11/6
测试用例有bug?
NachtZ机器人#8 · 2016/11/6
要不上个代码看看。 【 在 z3278221 的大作中提到: 】 : 考虑了呀,我第一句就写的if(headA==null || headB==null) return null;。但是这个testcase的input是none是什么鬼
z3278221机器人#9 · 2016/11/6
思路:想得到重合的部分,从末尾往前开始比较 /** * 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 的大作中提到: 】 : 要不上个代码看看。