题目链接
https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
初次读题
初次读题可知
- 两个指针相同即需要求得的结果
- 链表长度可能不同
- 两个链表可能没有交叉点,此时返回NULL
- 不可修改链表结构
- 链表中无循环
我第一次读题时看的是英文版,并且我刚开始做LeetCode对题目风格也不熟悉,同时这道题的Example也是很神奇,我一下子没有理解题意,看了中文版的题目和题解后才明白这个题是怎么做的。
注意点
根据这道题的代码模板和最终答案可知,最终我们需要找到交叉结点的指针。
在Example1中,val为1的两个结点虽然内容相同,但不是交叉点,因为交叉点的定义是同时存在于两个链表中。
题解一
思路
假如两个链表有交叉点(intersection),则可以设两个链表彼此不重复的结点个数分别为d1和d2,重复的结点个数为d。如果一个链表遍历完则使其从另外一个链表的头部重新开始,这样形成一个式子:d1+d+d2=d2+d+d1
。
假如两个链表没有交叉点,这也只是d=0
的一个特例,因此只要实现上述思路即可。
关于思路,可以看看这个题的一个视频题解:
代码
// Problem: Leetcode 160
// URL: https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
// Tags: Linked List
// Difficulty: Easy
#include <iostream>
using namespace std;
struct ListNode{
int val;
ListNode* next;
ListNode(int x):val(x),next(NULL){}
};
class Solution{
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB){
// Deal with the border "nullptr"
if (nullptr==headA || nullptr==headB)
{
return nullptr;
}
ListNode *ptrA = headA;
ListNode *ptrB = headB;
// d1+d+d2=d2+d+d1
while (ptrA != ptrB){
ptrA = nullptr == ptrA ? headB : ptrA->next;
ptrB = nullptr == ptrB ? headA : ptrB->next;
}
return ptrA;
}
};
int main()
{
// system("pause");
return 0;
}
题解二
也看到有人讲这个思路:
遍历链表A并将每个结点的指针存入set,然后遍历链表B并判断每个结点指针是否存在于set中。
作者:@臭咸鱼
转载请注明出处:https://www.cnblogs.com/chouxianyu/
欢迎讨论和交流!