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);
    }
};
相关推荐
leobertlan21 小时前
好玩系列:用20元实现快乐保存器
android·人工智能·算法
青梅橘子皮21 小时前
C语言---指针的应用以及一些面试题
c语言·开发语言·算法
_深海凉_1 天前
LeetCode热题100-有效的括号
linux·算法·leetcode
被开发耽误的大厨1 天前
1、==、equals、hashCode底层原理?重写场景?
算法·哈希算法
WolfGang0073211 天前
代码随想录算法训练营 Day38 | 动态规划 part11
算法·动态规划
松☆1 天前
C++ 算法竞赛题解:P13569 [CCPC 2024 重庆站] osu!mania —— 浮点数精度陷阱与 `eps` 的深度解析
开发语言·c++·算法
jr-create(•̀⌄•́)1 天前
正则化和优化算法区别
pytorch·深度学习·神经网络·算法
li星野1 天前
刷题:数组
数据结构·算法
tankeven1 天前
HJ182 画展布置
c++·算法
CS_Zero1 天前
无人机路径规划算法——EGO-planner建模总结—— EGO-planner 论文笔记(一)
论文阅读·算法·无人机