算法 ----- 链式

目录

[一 、链式](#一 、链式)

[二 、题目](#二 、题目)

1、两两相加

(1)题目

[(3) 代码书写](#(3) 代码书写)

2、两两交换链表中的节点

(1)题目

[(2) 解题思路](#(2) 解题思路)

(3)代码书写

3、重排链表

(1)题目

(2)解题思路

(3)代码实现

4、合并K个升序链表

(1)题目

(2)解题思路

(3)代码解答

5、K个一组反转链表

(1)题目

(2)解题思路

(3)代码实现


一 、链式

利用链表来解决问题

二 、题目

1、两两相加

(1)题目

(3) 代码书写

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)
    {
        ListNode* cur1 = l1;
        ListNode* cur2 = l2;
        ListNode* head = new ListNode(0);
        int t =0; 
        ListNode* pur = head;
        while(cur1||cur2||t)
        {
        if(cur1)
        {
            t+= cur1->val;
            cur1 = cur1->next;
        }
       if(cur2)
        {
            t+= cur2->val;
            cur2 = cur2->next;
        }
      
         pur->next = new ListNode(t%10);
         pur = pur -> next;
         t/=10;
        }
        ListNode* pcur = head -> next;
        delete head;
        return pcur;
    }
    
};

2、两两交换链表中的节点

(1)题目

(2) 解题思路

我们也可通过定义四个指针,改变她们的next值来交换结点

边界值为

(3)代码书写

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* swapPairs(ListNode* head)
    {
        ListNode* prevhead = new ListNode(0);
        prevhead -> next = head;
        if(head == nullptr || head -> next == nullptr)
        {
            return head;
        }
        ListNode* prev = prevhead, *cur = head, *pnext = head -> next, *nnext = pnext->next;
        while(pnext&&cur)
        {
            prev->next = pnext;
            pnext ->next = cur;
            cur->next = nnext;
            prev = cur;
            cur = prev->next;
            if(nnext)pnext = nnext->next;
            if (pnext) nnext = pnext ->next;
        }
        cur = prevhead ->next;
        delete prevhead;
        return cur;
    }
};

3、重排链表

(1)题目

(2)解题思路

1、找到链表的中间

快慢指针

2、逆序后半段的指针(断开两端的指针)

双指针

3、将两端指针链接

双指针

(3)代码实现

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:
    void reorderList(ListNode* head) 
    {
        ListNode *slow = head;
        ListNode *fast = head;
        while(fast && fast->next)
        {
            slow = slow -> next;
            fast = fast -> next -> next;
        }
        ListNode* newhead = new ListNode(0);
        ListNode *ret = slow -> next;
        slow -> next = nullptr; 
        while(ret)
        {
            ListNode *next = ret -> next;
            ret -> next = newhead -> next;
            newhead -> next = ret;
            ret = next; 
        }
        ListNode* re = new ListNode(0);
        ListNode *cur1 = head;
        ListNode *prev = re;
        ListNode *cur2 = newhead -> next;
        while(cur1)
        {
            prev -> next = cur1;
            prev = prev -> next;
            cur1 = cur1 -> next;
            if(cur2)
            {
                prev->next = cur2;
                prev = prev -> next;
                cur2 = cur2 -> next;
            }
        }
        delete newhead;
        delete re;
    }
};

4、合并K个升序链表

(1)题目

(2)解题思路

解题思路一:我们可以设一个优先级队列,将各个链表头入列,在创建一个链表最小链入链表中

在让它的头出对列

解法思路二:归并我们可以通过归并将链表分为两个,在将两个链表进行排序

(3)代码解答

思路一代码:

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 
{
    struct cmp
    {
    bool operator()(const ListNode* l1,const ListNode* l2)
    {
        return l1->val > l2->val;
    }
    };
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) 
    {
        priority_queue<ListNode* , vector<ListNode*>, cmp> heap;
        for(auto e : lists)
        {
            if(e)
            {
            heap.push(e);
            }
        }
        ListNode *head = new ListNode(0);
        ListNode *cur = head;
        while(!heap.empty())
        {
            cur->next = heap.top();
            cur = cur -> next;
            heap.pop();
            if(cur->next)
            heap.push(cur->next);
        }
        cur= head->next;
        delete head;
        return cur;
    }
};

思路二解答:

5、K个一组反转链表

(1)题目

(2)解题思路

解题思路一:我们可以首先算出来有我们需要反转几次,然后我们就可以将他看作为几个逆置

(3)代码实现

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* reverseKGroup(ListNode* head, int k) 
    {
        int n = 0;
        ListNode *cur = head;
        while(cur)
        {
            cur= cur->next;
            n++;
            
        }
        n/=k;
        ListNode* newhead = new ListNode(0);
        ListNode *prev = newhead;
        cur = head;
        for(int j = 0; j < n; j++)
        {
            ListNode* tmp = cur;
           for(int i = 0; i < k ;i++)
            {
                ListNode *next = cur->next;
                cur -> next  = prev -> next;
                prev -> next = cur;
                cur = next;
            }
            prev = tmp;
        }
        prev ->next = cur;
        cur = newhead -> next;
        delete newhead;
        return cur;
    }
};
相关推荐
小O的算法实验室16 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
郭涤生18 小时前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿18 小时前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz18 小时前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能18 小时前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****18 小时前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能18 小时前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能18 小时前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数
CoderCodingNo18 小时前
【GESP】C++四、五级练习题 luogu-P1177 【模板】排序
数据结构·c++·算法
Proxy_ZZ018 小时前
从零实现LDPC比特翻转译码器:C语言实战与底层逻辑解析
c语言·算法