标签:tno ext 每日一题 否则 int order nullptr ret lse
给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null
。
三种方法:1、暴力遍历 2、双指针(建议) 3、哈希表
1、暴力遍历
特判:如果两个链表其中一个为空,则返回空
思想:利用两个指针,A指针指向一条链表的一个节点,B一个指针循环遍历另一条链表。当A指针不为空的时候,B指针开始从头遍历,B不为空时,判断节点是否相交,如果相交,则返回节点,否则B指针后移一位。B指针遍历完一次后,A指针后移一位。最后如果没有找到,返回null。
/** * 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) { if(headA == nullptr || headB == nullptr) return nullptr; ListNode *a = headA; ListNode *b = headB; while(a != nullptr){ b = headB; while(b != nullptr){ if(a == b) return a; else b = b->next; } a = a->next; } //没找到 return nullptr; } };
2、双指针(指针遍历完所属链表后,遍历下一个链表,这样相交时,一定是相交节点)
两个指针分别指向两条链表的头节点,如果不等,则移动,如果移动到null时,移动到另一条链表的头节点,否则后移一位。
/** * 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) { if(headA == nullptr || headB == nullptr) return nullptr; ListNode *a = headA; ListNode *b = headB; while(a != b){ if(a == nullptr) a = headB; else a = a->next; if(b == nullptr) b = headA; else b = b->next; } return a; } };
3、哈希表
同样是两个指针分别指向两条链表的头节点。然后将第一条链表的节点加入到哈希表中,再将第二条链表的结点加入到哈希表中,边加入边判断,第二条链表的结点是否已经存在于哈希表中,如果存在了,则直接返回,否则结点后移一位。
/** * 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) { if(headA == nullptr || headB == nullptr) return nullptr; ListNode *a = headA; ListNode *b = headB; unordered_map<ListNode*, int> map; while(a != nullptr){ map[a]++; a = a->next; } while(b != nullptr){ map[b]++; if(map[b] == 2) return b; b = b->next; } return nullptr; } };
《从头再来》
标签:tno ext 每日一题 否则 int order nullptr ret lse
原文地址:https://www.cnblogs.com/azie420/p/14849240.html