输入两个链表,找出它们的第一个公共节点。
这是剑指offer上的一道easy题,但是有着诗意的解法,当然先上我的low代码,答案是8.
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
Stack<ListNode> stack1 = new Stack<>();
Stack<ListNode> stack2 = new Stack<>();
while(headA!=null){
stack1.push(headA);
headA=headA.next;
}
while(headB!=null){
stack2.push(headB);
headB=headB.next;
}
ListNode tmp=null;
while(!stack1.isEmpty()&&!stack2.isEmpty()){
ListNode node1=stack1.pop();
ListNode node2=stack2.pop();
if(node1==node2){
tmp=node1;
}
}return tmp;
}
时间和空间复杂度都是O(N),解法粗糙,主要是需要理解这里的公共是地址相同的意思,所以样例里面是8,而不是1.
再贴出大佬的代码:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode nodeA = headA;
ListNode nodeB = headB;
while(nodeA!=nodeB){
//当没有公共结点时,都遍历到对方的尾部为null也可以跳出循环
if(nodeA!=null)
nodeA=nodeA.next;
else
nodeA=headB;
if(nodeB!=null)
nodeB=nodeB.next;
else
nodeB=headA;
}
return nodeB;
}
大佬就是大佬,这种双指针解法叫做我们终会相遇,我们可以把链表看成是两部分组成,分别是私有部分和共有部分。
只需要在遍历完自己的私有+共有+对方的私有,那么两个指针必定相遇
因为 A的私有+共有+B的私有 = B的私有 + 共有 + A的私有,设置两个指针完成这个操作即可!
愿有情人终成眷属!!!