两个链表的第一个公共节点

就是剑指offer面试题52,两个链表的第一个公共节点

所谓公共节点大概就是这样了,因为一个链表只能有一个后继

如果两个节点恰好在末尾,如果两个链表的节点在第一个位置,那就是一条链表了

对两个链表从头到尾进行遍历都没有相同的位置,那么肯定就没有公共的节点

 

看书上说,也可以用两个辅助栈来实现:

把第一个链表放进栈里

把第二个链表放进栈里

然后再弹出(也就是从两个链表的结尾开始弹,如果两条链表相交,则两链表至少有一个节点相同),直到节点不一致,那么就是到了分叉口。

这里我没有用两个辅助栈的做法,而是从两个链表的开始,让长的链表的指针先跑(跑的距离就是长短链表的长度差值),这样两链表同时进行遍历,如果有相同节点则是第一个节点

代码:

public class Main {

    public Node getPublicNode(Node head1,Node head2){
        if(head1==null||head2==null){
            return null;
        }
        /**
         * length1 : head1的长度
         * length2 : head2的长度
         * flag : 长度的链表比短的链表的差值
         */
        int length1=0;
        int length2=0;
        for(Node phead=head1;phead!=null;phead=phead.next){
            length1++;
        }
        for(Node phead=head2;phead!=null;phead=phead.next){
            length2++;
        }

        int flag=length1>length2?length1-length2:length2-length1;
        Node p1=head1,p2=head2;
        //让短的那个链表先走flag个长度
        for(int i=0;i<flag;i++){
            if(length1>length2){
                p1=p1.next;
            }else if(length2>length1){
                p2=p2.next;
            }
        }
        //这下两条链表两个指针初始的位置相同,可以进行遍历
        while((p1!=null)&&(p1!=p2)&&(p2!=null)){
            p1=p1.next;
            p2=p2.next;
        }
        //相等的时候就是交点了
        return p1;
    }
}
class Node{
    int data;
    Node next;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值