原题
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.
题目分析
求2个链表的交集所在的节点。注意题目中给出的注意事项。
代码实现
public ListNode GetIntersectionNode(ListNode headA, ListNode headB)
{
if (headA == null || headB == null)
return null;
ListNode a = headA;
ListNode b = headB;
while (a!= b)
{
if (a == null)
a = headB;
else
{
a = a.next;
}
if (b == null)
b = headA;
else
{
b = b.next;
}
}
return a;
}
说实话这个代码不是非常好理解。我们做一个模拟看一下,到底这个算法的意思是什么。
static void Main(string[] args)
{
SolutionLinkedList s = new SolutionLinkedList();
ListNode headA = s.CreateLinkList(new int[] { 1, 2, 3,5,6 });
ListNode headB = headA.next;
ListNode interNode = s.GetIntersectionNode(headA, headB);
Console.ReadLine();
}
程序比较的过程
更多LinkList题目
http://blog.youkuaiyun.com/daigualu/article/details/69077428