输入两个链表,找出它们的第一个公共结点。
思路:
两个有公共节点的链表,具有这样的特点:单向链表的节点的的属性有节点的值,它指向的下一个节点。所以当有一个公共节点时,不仅值相同,它们指向的下一个节点也相同,依次类推。两个有公共节点的链表,从第一个公共节点开始,直到尾节点都相同。
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;
}
}