编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:
在节点 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;
}