链表求交点 【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;
}