2.LeetCode.160.Intersection of Two Linked Lists【链表求交点】

链表求交点 【160】(easy)

#include <iostream>
#include <set>
using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

int get_list_length(ListNode *head) {
    int len = 0;
    while (head) { // 遍历链表,计算链表长度
        len++;
        head = head->next;
    }
    return len;
}

ListNode *forward_long_list(int long_len, int short_len, ListNode *head) {
    int delta = long_len - short_len;
    while (head && delta) { // 指针从head移动至多出节点后面的位置
        head = head->next;
        delta--;
    }
    return head;
}

class Solution {
  public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        // 方法二
        // A、B 链表长度
        int list_A_len = get_list_length(headA);
        int list_B_len = get_list_length(headB);
        if (list_A_len > list_B_len)
            // A长 移动A到对应位置
            headA = forward_long_list(list_A_len, list_B_len, headA);
        else
            // B长 移动B到对应位置
            headB = forward_long_list(list_B_len, list_A_len, headB);
        while (headA && headB) {
            if (headA == headB) // 当两指针指向同一节点时说明找到了
                return headA;
            headA = headA->next;
            headB = headB->next;
        }
        return NULL;
    }

    // ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    //     // 方法一、使用set
    //     std::set<ListNode *> node_set;
    //     while (headA) {              // 查找集体合node_set
    //         node_set.insert(headA);  // 链表A节点插入node_set
    //         headA = headA->next;     // 遍历链表A
    //     }
    //     while (headB) {
    //         if (node_set.find(headB) != node_set.end()) {
    //             return headB;  //
    //             当在headB中找到第一个出现在node_set中的节点时
    //         }
    //         headB = headB->next;  // 遍历链表B
    //     }
    //     return NULL;
    // }
};

int main() {
    ListNode a1(1);
    ListNode a2(2);
    ListNode b1(3);
    ListNode b2(4);
    ListNode b3(5);
    ListNode c1(6);
    ListNode c2(7);
    ListNode c3(8);
    a1.next = &a2;
    a2.next = &c1;
    c1.next = &c2;
    c2.next = &c3;
    b1.next = &b2;
    b2.next = &b3;
    b3.next = &c1;

    /**
     *       headA
     *            | a1 -> a2 -
     *                         \
     *                          \
     *                           c1 -> c2 -> c3
     *                          /
     * headB                   /
     *      | b1 -> b2 -> b3 -
     */

    Solution solve;
    ListNode *result = solve.getIntersectionNode(&a1, &b1);
    cout << result->val << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值