面试题 02.07. 链表相交 ,142.环形链表II
面试题 02.07. 链表相交:
设置工作指针时把两个指针设在一起了。。。
int lengthList(struct ListNode *p){
int count = 0;
while(p!=NULL){
p = p->next;
count++;
}
return count;
}//计算链表长度
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
int lengthheadA = lengthList(headA);//赋值
int lengthheadB = lengthList(headB);
struct ListNode* p1 = headA;//设置工作指针
struct ListNode* p2 = headB;
while (lengthheadA > lengthheadB){
p1 = p1->next;
lengthheadA--;
}
while (lengthheadB > lengthheadA){
p2 = p2->next;
lengthheadB--;
}
while(p1!=p2){
if(p1==NULL) return NULL;
if(p2==NULL) return NULL;
p1=p1->next;
p2=p2->next;
}
return p1;
}
142.环形链表II:
通过计算得出环形链表入口和相遇点的距离等于头节点到环形链表入口的距离,当找到环形链表入口时,将一个工作指针重新从头节点开始,两工作指针相交时就是链表入口。
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode *p1 = head, *p2 = head;
while (p2 != NULL && p2->next != NULL) {
p1 = p1->next; // 慢指针移动一步
p2 = p2->next->next; // 快指针移动两步
if (p1 == p2) { // 如果快慢指针相遇
p1 = head; // 将慢指针重置为头节点
while (p1 != p2) { // 再次遍历直到两个工作指针再次相遇
p1 = p1->next;
p2 = p2->next;
}
return p1; // 返回环的开始节点
}
}
return NULL; // 如果没有环,返回NULL
}
总结:链表确实是有很多细节,越界,虚拟头节点的定义需要注意,环形链表没想到还有方程。