408算法题leetcode--第15天

143. 重排链表

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* findMiddle(ListNode* head){
        ListNode* p = head, *q = head;
        // q移动2步,p移动一步
        while(q->next && q->next->next){
            q = q->next->next;
            p = p->next;
        }
        return p;
    }
    ListNode* reverseList(ListNode* head){
        ListNode* pre = nullptr, *cur = head, *next = nullptr;
        while(cur){
            next = cur->next;
            cur->next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }
    void mergeList(ListNode* l, ListNode* r){
        ListNode* p = l, *q = r;
        while(p && q){
            ListNode* t1 = p->next, *t2 = q->next;
            p->next = q;
            p = t1;
            q->next = p;
            q = t2;
        }
    }
    void reorderList(ListNode* head) {
        if(head == nullptr) return;
        // 思路:找到链表中点,右链表逆转,逐一合并左右链表节点
        // 1. 找中点
        ListNode* mid_head = findMiddle(head);
        ListNode* right_head = mid_head->next;
        mid_head->next = nullptr;
        // 2. 右边翻转
        right_head = reverseList(right_head);
        // 3. 合并两个链表
        mergeList(head, right_head);
    }
};

2. 两数相加

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* addTwoNumbers(ListNode* l1, ListNode* l2) {
        // 思路1:读取数字,倒序,相加,倒序,链表
        // 思路2:对应位置相加,进位到后一位
        ListNode* dummy_head = new ListNode();
        ListNode* cur = dummy_head;
        int carry = 0;
        while(l1 || l2 || carry){
            int a = l1 ? l1->val : 0;
            int b = l2 ? l2->val : 0;
            int sum = a + b + carry;
            carry = sum / 10;
            cur->next = new ListNode(sum % 10);
            cur = cur -> next;
            if(l1) l1 = l1->next;
            if(l2) l2 = l2->next;
        }
        return dummy_head->next;
    }
};

445. 两数相加 II

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){
        ListNode* pre = nullptr, *cur = head, *next = nullptr;
        while(cur){
            next = cur->next;
            cur->next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }
    ListNode* addList(ListNode* lhs, ListNode* rhs){
        ListNode* dummy_head = new ListNode();
        ListNode* cur = dummy_head;
        int carry = 0;
        while(carry || lhs || rhs){
            int a = lhs ? lhs->val : 0;
            int b = rhs ? rhs->val : 0;
            int sum = a + b + carry;
            carry = sum / 10;
            cur->next = new ListNode(sum % 10);
            cur = cur->next;
            if(lhs) lhs = lhs->next;
            if(rhs) rhs = rhs->next;
        }
        return dummy_head->next;
    }
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        // 反转2个链表,然后相加
        ListNode* p = reverseList(l1), *q = reverseList(l2);
        ListNode* ret = addList(p, q);
        return reverseList(ret);
    }
};
相关推荐
NAGNIP18 分钟前
一文搞懂树模型与集成模型
算法·面试
NAGNIP24 分钟前
万字长文!一文搞懂监督学习中的分类模型!
算法·面试
技术狂人16827 分钟前
工业大模型工程化部署实战!4 卡 L40S 高可用集群(动态资源调度 + 监控告警 + 国产化适配)
人工智能·算法·面试·职场和发展·vllm
D_FW39 分钟前
数据结构第六章:图
数据结构·算法
a程序小傲1 小时前
京东Java面试被问:动态规划的状态压缩和优化技巧
java·开发语言·mysql·算法·adb·postgresql·深度优先
自学不成才2 小时前
深度复盘:一次flutter应用基于内存取证的黑盒加密破解实录并完善算法推理助手
c++·python·算法·数据挖掘
CS创新实验室2 小时前
计算机专业考研复试全解析:流程、内容与策略
考研·408·复试
June`2 小时前
全排列与子集算法精解
算法·leetcode·深度优先
徐先生 @_@|||2 小时前
Palantir Foundry 五层架构模型详解
开发语言·python·深度学习·算法·机器学习·架构