码迷,mamicode.com
首页 > 其他好文 > 详细

《从头再来》每日一题.160 相交链表

时间:2021-06-04 19:32:40      阅读:0      评论:0      收藏:0      [点我收藏+]

标签: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;   
    }
};

《从头再来》

《从头再来》每日一题.160 相交链表

标签:tno   ext   每日一题   否则   int   order   nullptr   ret   lse   

原文地址:https://www.cnblogs.com/azie420/p/14849240.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!