您的位置:首页 > 编程语言 > Java开发

leetcode解题之160# Intersection of Two Linked Lists Java版 (两个链表的第一个公共结点)

2017-03-14 15:04 519 查看

160. Intersection of Two Linked Lists

Write a program to find the node at which the intersection of two singly linked lists begins.

For example, the following two linked lists:

A:          a1 → a2
↘
c1 → c2 → c3
↗
B:     b1 → b2 → b3

begin to intersect at node c1.

Notes:

If the two linked lists have no intersection at all, return
null
.
The linked lists must retain their original structure after the function returns.

You may assume there are no cycles anywhere in the entire linked structure.
Your code should preferably run in O(n) time and use only O(1) memory.
查找两个链表的第一个公共节点,如果两个节点的尾节点相同,肯定存在公共节点

方法: 长的链表开始多走 (h1的数量 - h2的数量)步,然后和短链表同步往下走,遇到的第一个相同的节点就是最早的公共节点

class ListNode {
int val;
ListNode next;

ListNode(int x) {
val = x;
next = null;
}
}
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null)
return null;
ListNode h1 = headA;
ListNode h2 = headB;
// lenA为A链表的长度,初始值为1
int lenA = 1;
int lenB = 1;
while (h1.next != null) {
lenA++;
h1 = h1.next;
}
while (h2.next != null) {
lenB++;
h2 = h2.next;
}
// 若A与B尾结点不同,则肯定没有相交。
if (h1 != h2)
return null;
else {
int count = Math.abs(lenA - lenB);
//h1指向链表长的头结点。
if (lenA >= lenB) {
h1 = headA;
h2 = headB;
} else {
h1 = headB;
h2 = headA;
}
for(int i=0;i<count;i++)
h1=h1.next;
while(h1 != null&&h2 != null && h1 != h2){
h1 = h1.next;
h2 = h2.next;
}
}
//若没有交点,则h1 为null
return h1;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐