Leetcode 160 链表相交
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
//虚拟头结点的声明
ListNode *dummyHeadA = new ListNode(0);
ListNode * dummyHeadB = new ListNode(0);
dummyHeadA-> next = headA;
dummyHeadB -> next = headB;
//
ListNode* curA = dummyHeadA;
ListNode* curB = dummyHeadB;
//求长度
int A = 0;
int B = 0;
while(curA->next != NULL){
A++;
curA = curA->next;
}
while(curB->next != NULL){
B++;
curB = curB->next;
}
//复位
curA = dummyHeadA;
curB = dummyHeadB;
//把A换成最长的
if(B >= A){
swap(A,B);
swap(curA,curB);
}
//求差
int gap = A - B ;
//移动A,让A,B尾巴对其
while(gap--){
curA = curA->next;
}
//移动判断
while(curA != NULL){
if(curA == curB){
return curA;
}
curA = curA->next;
curB = curB->next;
}
return NULL;
}
};
Leetcode19 删除倒数的节点
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(0);
dummyHead -> next = head;
//虚拟头结点
ListNode* fast = dummyHead;
ListNode* cur = dummyHead;
while(n--){
fast = fast -> next;
}
while(fast->next != NULL && n--){
fast = fast -> next;
cur = cur->next;
}
cur -> next = cur->next->next;
return dummyHead->next;
}
};
Leetcode 142 环形链表
题意: 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
说明:不允许修改给定的链表。
思路应该记住,很独特
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* slow = head;
ListNode* fast = head;
while(fast!=NULL && fast->next!=NULL){
fast = fast->next->next;
slow = slow->next;
if(fast == slow){
ListNode* indexA = fast;
ListNode* indexB = head;
while(indexA != indexB){
indexB= indexB->next;
indexA = indexA->next;
}
return indexA;
}
}
return NULL;
}
};