题目延伸:编程之美中的求两个节点是否相交:将两个节点串在一起,若有节点,串在一起的节点就会出现环,利用一二不长不等,两个节点在环中必然相遇。
本题描述:输入两个链表,找出它们的第一个公共结点。
分析:
一个简单的方法是:首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个节点。在第二次遍历的时候,先在较长的节点上走若干步,接着同时在两个链表上遍历,找到的第一个相同的节点就是它们的公共的节点。
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;
}
}
本文介绍了一种高效算法来确定两个链表的第一个公共节点。通过先计算两个链表的长度差,然后调整遍历起点,确保同时遍历两链表时能准确找到第一个公共节点。
392

被折叠的 条评论
为什么被折叠?



