面试题52-求两个链表的第一个公共节点

题目:输入两个链表,找出它们的第一个公共节点。

思路一
1. 分别设置一个指针,对链表进行遍历,求得这两个链表的长度差 d d d
2. 较长的链表先遍历 d d d 个结点。
3. 较短的结点继续从头开始遍历,此时较长的链表也继续遍历,二者同时移动一步,比较二者指针指向的地址是否相同,而不是看结点的值是否相等。

java代码
public class Solution { 

    public ListNode getIntersectionNode(ListNode headA, ListNode headB) { 
    	// 如果两个链表都为空,返回空。
        if(headB==null||headA==null) return null; 
        // 创立两个指针,分别指向表头。
        ListNode cur1=headA,cur2=headB; 
        int n=0; 
        // 遍历链表1,并计算出其结点数量n
        while(cur1!=null){ 
            n++; 
            cur1=cur1.next; 
        }
		// 遍历链表2,反向计算出其结点数量n
        while(cur2!=null){ 
            n--;
            cur2=cur2.next; 
        } 
        // 如果n>0,说明链表1更长,如果n<0,说明链表2更长。
        // cur1指向更长的表头。
        cur1=n>0?headA:headB; 
        // 如果cur1指向的是表2,则cur2指向表1,如果cur1指向的是表1,则cur2指向表2。
        cur2=cur1==headA?headB:headA; 
        // 保证两个链表的长度差是一个正值
        n=Math.abs(n); 
        // 更长的链表先移动n步
        while(n>0){ 
            cur1=cur1.next; 
            n--;
        } 
		// 二者同时移动,直到相等就停下。
        while(cur1!=cur2){ 
            cur2=cur2.next; 
            cur1=cur1.next; 
        } 
        // 返回其中一个即可。
        return cur1; 
    } 
} 
// 写不到作者这么简洁。代码能力还有待加强呀!!!!!!

思路二:大神解法,实在是佩服。我只是知识的搬运工。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值