题目:
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.
题意:
求两个单链表中的元素的交叉部分。此题有一些hints,首先如果两个单链表没有交叉元素存在,那么就直接返回null;没有环存在,然后就是考虑这个交叉到底是什么意思?一开始,我设想的还有点问题,其实这个交叉指的是从某一个节点开始,直到两个单链表的最后一个节点为止,这一部分是不是一致。所以有一种思路是,先求这两个单链表的长度,然后比较,因为只有从某一个节点开始直到单链表的尾部,长度长的那个单链表直接从两个长度差值的那个节点开始搜寻,然后就是用一个循环来依次判断两个节点的val值是否相同,如果相同,那么就可以返回这个节点了。一开始LZ有点纠结的就是这个交叉怎么理解,后来明白了,要从某一个节点开始直到结束,所以用上面的方法解决比较好。以后做这些题思路需要打开一点,java中的各种数据结构的应用还是非常给力的,对于解决这种题目非常有帮助。
class ListNode
{
int val;
ListNode next;
ListNode(int x)
{
val = x;
next = null;
}
}
public class Solution
{
public static ListNode getIntersectionNode(ListNode headA,ListNode headB)
{
if(headA == null || headB == null)
return null;
else
{
ListNode l1 = headA;
ListNode l2 = headB;
int length1 = 1;
int length2 = 1;
while(l1.next != null)
{
length1 ++;
l1 = l1.next;
}
while(l2.next != null)
{
length2 ++;
l2 = l2.next;
}
//System.out.println(l1.val + " " + l2.val);
if(l1.val != l2.val) //节省计算开销,若发现尾节点不一致,那么就直接返回空,说明两个链表没有交叉出现
return null;
else
{
//System.out.println(length1 + " " + length2);
if(length1 > length2)
{
int value = length1 - length2;
while(value > 0)
{
headA = headA.next;
value --;
}
//System.out.println(headA.val);
}
else if(length1 <= length2)
{
int value = length2 - length1;
while(value > 0)
{
headB = headB.next;
value --;
}
//System.out.println(headB.val);
}
while(headA.val != headB.val)
{
//System.out.println(headA.val + " " + headB.val);
headA = headA.next;
headB = headB.next;
//System.out.println(headA.val + " " + headB.val);
}
//System.out.println(headA.next.val + " " + headB.next.val);
return headB;
}
}
}
/*
public static void main(String args[])
{
ListNode headA = new ListNode(1);
ListNode l1 = new ListNode(3);
ListNode l2 = new ListNode(5);
ListNode l3 = new ListNode(6);
ListNode l4 = new ListNode(7);
ListNode l5 = new ListNode(8);
ListNode l6 = new ListNode(9);
ListNode l7 = new ListNode(10);
headA.next = l1;
l1.next = l2;
l2.next = l3;
l3.next = l4;
l4.next = l5;
l5.next = l6;
l6.next = l7;
l7.next = null;
ListNode headB = new ListNode(2);
ListNode r1 = new ListNode(4);
ListNode r2 = new ListNode(6);
ListNode r3 = new ListNode(7);
ListNode r4 = new ListNode(8);
ListNode r5 = new ListNode(9);
ListNode r6 = new ListNode(10);
headB.next = r1;
r1.next = r2;
r2.next = r3;
r3.next = r4;
r4.next = r5;
r5.next = r6;
r6.next = null;
System.out.println(getIntersectionNode(headA,headB).val);
}
*/
}