- 前言:
在用Stack ArrayList等容器时,一定要加泛型。第二次犯这个错误了。
Stack没加ListNode泛型,导致我result=stack1.peek();这个代码总是显示错误 - 题目:
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
-
思路:
第一个公共结点后的部分都是公共的,那么把两个链表反转,反转后,从前往后遍历,找最后一个相同的结点就行了。(错误示范啊,第一条链表反转的时候,因为两条链表有公共部分,会改变第二条链表)
。。方法1:然后回到我最初的想法,利用长度来做,前面的题目也有类似的思维,比如链表a比链表b长,那么让链表a先走(a-b)步,然后两个链表一起走,这样就会同时到达公共结点。
。。 方法2:利用栈来做,这种可以从后往前的,利用栈的特性就很好。存储后,两个链表对应栈顶的元素都是相同的,一个一个的比较取出。 -
代码:
import java.util.Stack;
class Solution2 {
public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
ListNode result=null;
Stack<ListNode> stack1=putintoStack(pHead1);//一定要加泛型
Stack<ListNode> stack2=putintoStack(pHead2);
while(!stack1.isEmpty()&&!stack2.isEmpty()&&stack1.peek()==stack2.peek()){
result=stack1.peek();
stack1.pop();
stack2.pop();
}
return result;
}
//将链表结点存入栈
public Stack<ListNode> putintoStack(ListNode pHead1){
Stack<ListNode> stack=new Stack();
while(pHead1!=null){
stack.push(pHead1);
pHead1=pHead1.next;
}
return stack;
}
}
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}