题目描述:输入两个链表,找出它们的第一个公共结点。
我的思路:起初看到这个题目我的思路是从其中的一个链表开始,然后依次和第二个链表的进行比较,但这样的话时间复杂度比较大,所以这个方法也只能是比较笨的方法了。再后 来,参考了书上的想法后,大致有以下两种思路:
(1)从链表的尾部开始遍历,找到它们最后最后一个相同的结点,但这种想法需要借助栈来实现;
(2)比较两个链表的长度,让链表长的先遍历,直至和链表短的长度相同,此时两个链表同时开始遍历,找到它们的第一个相同结点即为它们的公共结点。
注意:我刚开始误以为公共结点是这两个链表第一个相同的结点,但不是,一旦找到了第一个公共结点,那它之后的结点肯定是相同的,也就是成Y型,如下图:
代码实现(思路二):
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { if(pHead1==null||pHead2==null) return null; int len1 = 0,len2=0; ListNode pnode1 = pHead1; ListNode pnode2 = pHead2; while(pnode1!=null) { len1++; pnode1 = pnode1.next; } while(pnode2!=null) { len2++; pnode2 = pnode2.next; } int n = len1-len2; if(n>0) { while(n>0) { pHead1=pHead1.next; n--; } while(pHead1!=pHead2) { pHead1 = pHead1.next; pHead2 = pHead2.next; } return pHead1; } else if(n<=0) { while(n<0) { pHead2=pHead2.next; n++; } while(pHead1!=pHead2) { pHead2 = pHead2.next; pHead1 = pHead1.next; } return pHead1; } return null; } }
注意:之前因为理解错题的原因,使得括号里的判断条件写成了pHead1.val = pHead2.val,使得不能通过全部案例,所以这块要注意一下。