返回
LeetCode 160:相交链表
前端
2023-12-03 21:50:15
前言
踏入前端世界的我们,经常被后端工程师对算法如痴如醉的热情所感染。算法,似乎对我们来说是一个遥不可及的领域。然而,作为程序员,算法能力至关重要。在开发过程中,我们将实际问题转换成计算机可识别的指令,这正是算法的魅力所在。
LeetCode 160:相交链表
题目
给你两个单链表 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,则返回 null
。
解题思路
-
哈希表法 :
- 使用哈希表记录链表
headA
的每个节点。 - 遍历链表
headB
,如果某个节点已经在哈希表中,则说明两个链表相交,返回该节点。
- 使用哈希表记录链表
-
双指针法 :
- 设置两个指针,分别指向链表
headA
和headB
的头部。 - 同时向后移动两个指针,直到它们都到达链表的末尾。
- 如果两个指针都到达链表的末尾,则说明两个链表没有交点,返回
null
。 - 否则,将指针
headA
指向链表headB
的头部,将指针headB
指向链表headA
的头部。 - 继续同时向后移动两个指针,直到它们相遇,返回相遇的节点。
- 设置两个指针,分别指向链表
示例代码
/**
* 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) {
// 哈希表法
unordered_set<ListNode *> visited;
ListNode *temp = headA;
while (temp != NULL) {
visited.insert(temp);
temp = temp->next;
}
temp = headB;
while (temp != NULL) {
if (visited.find(temp) != visited.end()) {
return temp;
}
temp = temp->next;
}
return NULL;
// 双指针法
ListNode *p1 = headA;
ListNode *p2 = headB;
while (p1 != p2) {
p1 = p1 == NULL ? headB : p1->next;
p2 = p2 == NULL ? headA : p2->next;
}
return p1;
}
};
结语
算法作为程序员必备的能力,在前端开发中也不容忽视。希望这篇文章能帮助你理解 LeetCode 160:相交链表的解决方案,并启发你进一步探索算法世界。算法的魅力无穷,坚持学习,终会成为一名优秀的程序员!