剑指offer----两个链表的第一个公共节点----java实现

输入两个链表,找出它们的第一个公共结点。

思路:

两个有公共节点的链表,具有这样的特点:单向链表的节点的的属性有节点的值,它指向的下一个节点。所以当有一个公共节点时,不仅值相同,它们指向的下一个节点也相同,依次类推。两个有公共节点的链表,从第一个公共节点开始,直到尾节点都相同。

 1--> 3-->4-->

              6--->7--->1-->8

5--->2--->

方法一:可以借助两个辅助栈,将两个链表都压入到栈中,然后每次一起弹出,直到弹出的节点值不同将节点返回。便是第一个公共节点。

方法二:(1)先分别遍历两个链表得到链表的长度,

       (2)对比两个链表的长度,先让长的链表先走连个链表长度之差的步数,这样长链表剩下的长度与短链表相同,让他们一起往后走,可以同步走到第一个公共节点;

代码:

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2)
    { if(pHead1 == null || pHead2==null)
		   return null;
	   //得到两个链表的长度,并计算它们的长度差
	   int length1 = getLength(pHead1);
	   int length2 = getLength(pHead2);
	   //若链表1比链表2长 快指针指向链表长的头节点
	   int step = length1-length2;
	   ListNode pFast = pHead1;
	   ListNode pSlow = pHead2;
	   //若链表2长
	   if(step < 0)
	   {
		   step = length2-length1;
		   pFast = pHead2;
		   pSlow = pHead2;
	   }
	    //让快指针先走step步
	   for (int i = 0; i < step; i++)
	   {
		pFast = pFast.next;
	   }
	   //当两个链表都不为空,且节点不同时,就一起往后走
	   while(pFast != null && pSlow != null && pFast!=pSlow)
	   {
		   pFast = pFast.next;
		   pSlow = pSlow.next;
	   }
	   return pFast;  //找到第一个公共节点并返回
	   
   }
   
   //得到链表的长度
   private int getLength(ListNode pHead)
   {
	   int length =0;
	 while(pHead!=null)
	 {
		 length++;
		 pHead = pHead.next;
		 
	 }
	 return length;
   }
 
  }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值