题目:输入两个链表,找出它们的第一个公共结点。
思路:计算两个链表的长度。用 k 走完长链表多出的长度,然后长短链表同时遍历,如果两个index相同,则该点为第一个公共结点。
public static ListNode FistCommonNode(ListNode node1, ListNode node2) {
if (node1 == node2)
return node1;
int len1 = NodeGetLength(node1);
int len2 = NodeGetLength(node2);
if (len1 < len2) {
ListNode longNode = node2;
node2 = node1;
node1 = longNode;
}
int k = 0;
ListNode h1 = node1;
ListNode h2 = node2;
while (k < (len1>len2 ? len1 : len2)) {
if (k < Math.abs(len1-len2))
h1 = h1.next;
else {
if (h1 == h2)
return h1;
h1 = h1.next;
h2 = h2.next;
}
k ++;
}
return null;
}
// 计算链表的长度
public static int NodeGetLength(ListNode head) {
if (head == null)
return 0;
ListNode h = head;
int len = 0;
while (h.next != null) {
len ++;
h = h.next;
}
return len;
}