力扣hot100——相交,回文链表

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;

    }
};
相关推荐
竹子_2310 分钟前
《零基础入门AI:传统机器学习核心算法解析(KNN、模型调优与朴素贝叶斯)》
人工智能·算法·机器学习
boyedu11 分钟前
哈希指针与数据结构:构建可信数字世界的基石
数据结构·算法·区块链·哈希算法·加密货币
✿ ༺ ོIT技术༻32 分钟前
剑指offer第2版:双指针+排序+分治+滑动窗口
算法·排序算法·剑指offer·双指针·滑动窗口·分治
细嗅蔷薇@1 小时前
C语言在键盘上输入一个3行3列矩阵的各个元素的值(值为整数),然后输出主对角线元素的积,并在fun()函数中输出。
c语言·算法·矩阵
新时代苦力工2 小时前
桶排序-Java实现
数据结构·算法·排序算法
爱吃芒果的蘑菇3 小时前
Python读取获取波形图波谷/波峰
python·算法
晨曦学习日记3 小时前
Leetcode239:滑动窗口最大值,双端队列的实现!
数据结构·c++·算法
CoovallyAIHub3 小时前
无人机图像+深度学习:湖南农大团队实现稻瘟病分级检测84%准确率
深度学习·算法·计算机视觉
2zcode3 小时前
基于Matlab自适应阈值分割算法的图像处理研究
图像处理·算法·matlab
阿群今天学习了吗3 小时前
RNN、LSTM、Transformer推荐博文
人工智能·笔记·python·学习·算法