leetcode-160 相交链表

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

如下面的两个链表:
在这里插入图片描述
在节点 c1 开始相交。

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

方法一:使用C++ set

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    set<ListNode *> node_set;
    ListNode *result = NULL;
    while(headA) {
        node_set.insert(headA);
        headA = headA->next;
    }

    while(headB) {
        if (node_set.find(headB) != node_set.end()){
            result = headB;
            break;
        }
        headB = headB -> next;
    }
    return result;
}

方法二:调整两个链表长度,一致后再遍历

int getListLen(ListNode *node) {
    int len = 0;
    while(node) {
        len ++;
        node = node -> next;
    }

    return len;
}

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    ListNode *result = NULL;
    int lenA;
    int lenB;

    lenA = getListLen(headA);
    lenB = getListLen(headB);
	
	/*将较长的链表长度缩短*/
    int change = (lenA > lenB)? lenA - lenB:lenB - lenA;
    if (lenA > lenB) {
        while(headA && change) {
            headA = headA -> next;
            change --;
        }
    } else if (lenA < lenB) {
        while(headB && change) {
            headB = headB -> next;
            change --;
        }
    }

    while(headB && headA) {
        if (headA == headB) {
            result = headB;
            break;
        }
        headB = headB -> next;
        headA = headA -> next;
    }
    return result;
}
发布了239 篇原创文章 · 获赞 17 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Z_Stand/article/details/104182005
今日推荐