//合并两个有序链表
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l1) {
return l2;
}
if (!l2) {
return l1;
}
ListNode* dummy = new ListNode;
ListNode* res = dummy;
res->next = NULL;
while (l1 && l2) {
if (l1->val < l2->val) {
res->next = l1;
res = res->next;
l1 = l1->next;
} else {
res->next = l2;
res = res->next;
l2 = l2->next;
}
}
if(l1) {
res->next = l1;
}
if (l2) {
res->next = l2;
}
return dummy->next;
}
};
//反转链表
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (!head) {
return head;
}
ListNode* pre = head;
ListNode* cur = head->next;
pre->next = NULL;
while (cur) {
ListNode *temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
return pre;
}
};
//判断链表是否为回文链表
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(!head || !head->next) {
return true;
}
stack<int> s;
ListNode *slow = head;
ListNode *fast = head;
s.push(slow->val);
while (fast->next && fast->next->next) {
slow = slow->next;
fast = fast->next->next;
s.push(slow->val);
}
//奇数
if (fast->next == NULL) {
s.pop();
}
ListNode *cur = slow;
while (cur->next) {
cur = cur->next;
if (cur->val != s.top()) {
return false;
}
s.pop();
}
return true;
}
};
//判断两个单向链表是否相交
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
int lenA = 0, lenB = 0;
ListNode *l1 = headA;
ListNode *l2 = headB;
while (l1) {
l1 = l1->next;
lenA++;
}
while (l2) {
l2 = l2->next;
lenB++;
}
ListNode* longList = headA;
ListNode* shortList = headB;
if (lenA < lenB) {
longList = headB;
shortList = headA;
}
for (int i = 0; i < abs(lenA - lenB); i++) {
longList = longList->next;
}
while (longList && shortList) {
if (longList == shortList) {
return longList;
}
longList = longList->next;
shortList = shortList->next;
}
return NULL;
}
};
环形链表:
如果链表是有环的,快指针和慢指针最后会同时指向同一个节点。指针从 相遇点出发和从链表的头出发,最后会遍历相同数目的节点后在环的入口处相遇。
ListNode *detectCycle(ListNode *head) {
ListNode* fast = head;
ListNode* slow = head;
while (slow && fast) {
slow = slow->next;
fast = fast->next;
if (fast) {
fast = fast->next;
} else {
return 0;
}
if (fast == slow) {
fast = head;
while(fast != slow) {
slow = slow->next;
fast = fast->next;
}
return slow;
}
}
return 0;
}