1.相交链表

解法思路:
// 抽象为相遇问题,如果有交点,将A,B链表与相遇后链表看作一个整体
// a 和 b 相遇的地方就是交点2,如果不相遇就没有交点;
// 因为路线不同,但是如果相遇则必会有一点处俩者走过的路径相同
// 由于两个链表可能长度不同,但相交部分之后的节点是相同的,因此通过让两个指针分别遍历两个链表(并在到达链表末尾时切换到另一个链表的头节点),它们最终会在交点处相遇。如果链表不相交,则p和q最终都会变为NULL,循环结束。
cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
// 抽象为相遇问题,如果有交点,将A,B链表与相遇后链表看作一个整体
// a 和 b 相遇的地方就是交点2,如果不相遇就没有交点;
// 因为路线不同,但是如果相遇则必会有一点处俩者走过的路径相同
// 由于两个链表可能长度不同,但相交部分之后的节点是相同的,因此通过让两个指针分别遍历两个链表(并在到达链表末尾时切换到另一个链表的头节点),它们最终会在交点处相遇。如果链表不相交,则p和q最终都会变为NULL,循环结束。
ListNode *p = headA,*q = headB; // 从头出发的指针
while(p != q){ // 还未相遇到,则继续走 此处比较的是指针指向位置,并非所指节点的val
if(p != NULL){ // 走自己路
p = p->next;
}
else{ // 走完自己的后,走b的路径
p = headB;
}
q = q ? q->next : headA;
}
return p;
}
};
2.反转链表

解法思路:
// 暴力解法: 将原链表值取出,反转后构造新链表
// 双指针解法
// 将原来的指向颠倒,定义俩个指针,一个指向头的前面,一个指向头
// 将头的next指向他前面,然后后移,逐渐将链表反转
cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
// // 暴力解法: 将原链表值取出,反转后构造新链表
// vector<int> temp;
// ListNode *p = head;
// while (p != nullptr){
// temp.push_back(p->val);
// p = p->next;
// }
// p = head;
// reverse(temp.begin(),temp.end());
// while (p != nullptr){
// for (auto &val : temp){
// p->val = val;
// p = p->next;
// }
// }
// return head;
// 双指针解法
// 将原来的指向颠倒,定义俩个指针,一个指向头的前面,一个指向头
// 将头的next指向他前面,然后后移,逐渐将链表反转
ListNode *cur = head, *pre = NULL;
while(cur){
ListNode *temp = cur->next; // 保存原下一个节点
cur->next = pre; // 调转指向
pre = cur; // 前移
cur = temp;
}
return pre;
}
};