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

本文介绍了一种高效算法来确定两个链表的第一个公共节点。通过先计算两个链表的长度差,然后调整遍历起点,确保同时遍历两链表时能准确找到第一个公共节点。

题目延伸:编程之美中的求两个节点是否相交:将两个节点串在一起,若有节点,串在一起的节点就会出现环,利用一二不长不等,两个节点在环中必然相遇。


本题描述:输入两个链表,找出它们的第一个公共结点。


分析:

一个简单的方法是:首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个节点。在第二次遍历的时候,先在较长的节点上走若干步,接着同时在两个链表上遍历,找到的第一个相同的节点就是它们的公共的节点。


public class Solution {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
		int length1=getListLength(pHead1);
		int length2=getListLength(pHead2);
		int lengthDif=length1-length2;
		ListNode plong=pHead1;
		ListNode pshort=pHead2;
		if(length2>length1){
			plong=pHead2;
			pshort=pHead1;
			lengthDif=length2-length1;
		}
		for(int i=0;i<lengthDif;i++){
			plong=plong.next;
		}
		while(plong!=null&&pshort!=null&(plong!=pshort)){
			plong=plong.next;
			pshort=pshort.next;
		}
		return plong;
    }

	private int getListLength(ListNode pHead) {
		// TODO Auto-generated method stub
		int length=0;
		ListNode node=pHead;
		while(node!=null){
			length++;
			node=node.next;
		}
		return length;
	}
}




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值