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);
    }
};
相关推荐
薛定谔的算法19 分钟前
《盗梦空间》与JavaScript中的递归
算法
kaiaaaa42 分钟前
算法训练第十一天
数据结构·算法
?!71444 分钟前
算法打卡第18天
c++·算法
springfe01011 小时前
构建大顶堆
前端·算法
凌辰揽月2 小时前
Web后端基础(基础知识)
java·开发语言·前端·数据库·学习·算法
lifallen2 小时前
深入浅出 Arrays.sort(DualPivotQuicksort):如何结合快排、归并、堆排序和插入排序
java·开发语言·数据结构·算法·排序算法
jingfeng5142 小时前
数据结构排序
数据结构·算法·排序算法
能工智人小辰2 小时前
Codeforces Round 509 (Div. 2) C. Coffee Break
c语言·c++·算法
kingmax542120082 小时前
CCF GESP202503 Grade4-B4263 [GESP202503 四级] 荒地开垦
数据结构·算法
岁忧2 小时前
LeetCode 高频 SQL 50 题(基础版)之 【高级字符串函数 / 正则表达式 / 子句】· 上
sql·算法·leetcode