题目
输入两个链表,找出他们的第一个公共节点。下面第一个公共节点便是40。
1->2->3-----\
>40->50
10->20->30----/
思路
看到栈就忽然恍然大悟,然后在看到类似快慢指针,更大悟。
思路一:
分别遍历第一条链表和第二条链表,将其每个节点分别存入两个栈,然后依次出栈,最后一个相同的的栈顶元素就是第一个公共节点。
public static LinkListNode findtheFirstNode(LinkListNode head1,LinkListNode head2) { Stack<LinkListNode> st1 = new Stack<LinkListNode>(); Stack<LinkListNode> st2 = new Stack<LinkListNode>(); LinkListNode temp; for(temp=head1;temp!=null;temp=temp.next) st1.push(temp); for(temp= head2;temp!=null;temp=temp.next) st2.push(temp); LinkListNode result = null; while(st1.peek() == st2.peek()) { result = st1.pop(); st2.pop(); } return result; }
思路二:
类似于判断链表是否有环的快慢指针,我们先求出两个链表的长度差多少,然后让长链表的指针先走多少,然后两个指针一块走,直到两个指针指向的值相等,便是第一个公共节点。
public static LinkListNode findFirstSameNode2(LinkListNode head1,LinkListNode head2) { LinkListNode result = null; int countOne = 0; int countTwo = 0; for(LinkListNode p = head1 ; p!=null ;p=p.next) countOne++; for(LinkListNode p = head2 ; p!=null ;p=p.next) countTwo++; LinkListNode pLonghead=head1; LinkListNode pShorthead = head2; int diff = countOne - countTwo; if(countOne < countTwo) { pLonghead = head2; pShorthead = head1; diff =countTwo-countOne ; } for(int i = 0;i<diff ;++i) { pLonghead = pLonghead.next; } while(pLonghead!=null && pShorthead!=null && pLonghead != pShorthead) { pLonghead = pLonghead.next; pShorthead = pShorthead.next; } return pLonghead; }
版权声明:本文为博主原创文章,转载请注明出处。
时间: 2024-10-11 20:12:56