【Leetcode】160. 相交链表

题目描述:

编写一个程序,找到两个单链表相交的起始节点。

例如,下面的两个链表

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

在节点 c1 开始相交。

注意:

  • 如果两个链表没有交点,返回 null.
  • 在返回结果后,两个链表仍须保持原有的结构。
  • 可假定整个链表结构中没有循环。
  • 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。

解题思路:

1,暴力法:最开始的思路,暴力破解,虽然AC了,但是时间复杂度不符合要求。

2,正确思路:两链表有交点,那他们在交点之后的链都是相同的,所以只需要比较两个链表的长度,让长的链表先走多余的长度,然后逐个比较,第一个相等的结点即为相交结点。

AC代码:

1,暴力法:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) 
{
	while (headB)
	{
		ListNode* pResult = headA;
		while (pResult)
		{
			if (pResult == headB) 
				return pResult;
			else
			{
				pResult = pResult->next;
			}
		}
		headB = headB->next;
	}
	return NULL;
}
};

2,正确解法:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) 
{
	int lenA = 0;
	int lenB = 0;
	ListNode* pCurA = headA;
	ListNode* pCurB = headB;

	while (headA) { lenA++; headA = headA->next; }
	while (headB) { lenB++; headB = headB->next; }

	if (lenA > lenB)
	{
		for (int i = 0; i < lenA - lenB; i++)
		{
			pCurA = pCurA->next;
		}
	}
	else
	{
		for (int i = 0; i < lenB - lenA; i++)
		{
			pCurB = pCurB->next;
		}
	}

	while (pCurA)
	{
		if (pCurA == pCurB)
			return pCurA;
		else
		{
			pCurA = pCurA->next;
			pCurB = pCurB->next;
		}

	}
	return NULL;
}
};

猜你喜欢

转载自blog.csdn.net/wez031113/article/details/84105534