[LeetCode-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.
【分析】

1、可以将A,B两个链表看做两部分,交叉前与交叉后。

2、交叉后的长度是一样的,因此交叉前的长度差即为总长度差。

3、只要去除这些长度差,距离交叉点就等距了。

4、为了节省计算,在计算链表长度的时候,顺便比较一下两个链表的尾节点是否一样,若不一样,则不可能相交,直接可以返回NULL

代码如下:

/**
 * Definition for singly-linked list.
 **/
 struct ListNode {
     int val;
     struct ListNode *next;
 };
 
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
	if(!headA||!headB)
		return NULL;
	struct ListNode *headATemp = headA;
	struct ListNode *headBTemp = headB;
	
	/*1.Calculate the length of ListNode */
	int headALen = 1;
	int headBLen = 1;
	while(headATemp->next!=NULL) {
		headALen++;
		headATemp = headATemp->next;
	}
	while(headBTemp->next!=NULL) {
		headBLen++;
		headBTemp = headATemp->next;
	}
	/*If the last LinkNode is equal,then return NULL*/
	if(headATemp!=headBTemp)
		return NULL;
	
	/*Remove length difference*/
	if(headALen > headBLen) {
		while(headALen!=headBLen) {
			headALen--;
			headA = headA->next;
		}
	}
	else if(headALen < headBLen) {
		while(headALen!=headBLen) {
			headBLen--;
			headB = headB->next;
		}
	}
	/*If find the start point of the equal LinkNode,then exit the cycle*/
	while(headA!=headB) {
		headA = headA->next;
		headB = headB->next;
	}

	return headA;
}




你可能感兴趣的:(LeetCode)