leetcode算法刷题记录---6

合并K个升序链表(leetcode23)

C++

cpp 复制代码
#include <vector>
using namespace std;

// 合并K个升序链表
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 *mergeKLists(vector<ListNode *> &lists) {

        if(lists.empty()) return nullptr;
        ListNode * res = lists[0];
        for(int i=1; i<lists.size();i++){
            res = mergeTwoLists(res,lists[i]);
        }
        return res;
    }

    ListNode *mergeTwoLists(ListNode *linklist1, ListNode *linklist2) {
        if (linklist1 == nullptr) return linklist2;
        if (linklist2 == nullptr) return linklist1;
        // 新建虚拟头节点
        ListNode *dummy = new ListNode(0, nullptr);
        ListNode *end = dummy;
        while (linklist1 && linklist2) {
            ListNode *tmp;
            if (linklist1->val < linklist2->val) {
                tmp = linklist1;
                linklist1 = linklist1->next;

            } else {
                tmp = linklist2;
                linklist2 = linklist2->next;

            }
            tmp->next = nullptr;
            end->next = tmp;
            end = tmp;
        }

        if(linklist1) end->next = linklist1;
        if(linklist2) end->next = linklist2;
        end = dummy->next;
        delete dummy;
        return end;
    }
};

Python

python 复制代码
from typing import Optional,List
# 合并K个升序链表
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
class Solution:
    def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
        if not lists:
            return None
        res = lists[0]
        # 两两合并
        for i in lists[1:]:
            res = self.mergeTwoLists(res,i)
        return res

    def mergeTwoLists(self,linklist1: Optional[ListNode],linklist2: Optional[ListNode])->Optional[ListNode]:

        if not linklist1:
            return linklist2
        if not linklist2:
            return linklist1
        # 新建虚拟头节点
        dummy = ListNode(0,None)
        q = dummy
        while linklist1 and linklist2:
            if linklist1.val<linklist2.val:
                p = linklist1
                linklist1 = linklist1.next
            else:
                p = linklist2
                linklist2 = linklist2.next
            p.next = None
            q.next = p
            q = p
        if linklist1:
            q.next = linklist1
        if linklist2:
            q.next = linklist2
        return dummy.next
if __name__ == '__main__':
    test = [[1, 4, 5], [1, 3, 4], [2, 6]]
    a = ListNode(1,ListNode(4,ListNode(5,None)))
    b = ListNode(1,ListNode(3,ListNode(4,None)))
    c = ListNode(2,ListNode(6,None))
    s = Solution()
    res = s.mergeKLists([a,b,c])
    while res:
        print(res.val)
        res = res.next

重排链表(leetcode143)

C++

cpp 复制代码
from typing import Optional
# 重排链表
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
class Solution:
    def reorderList(self, head: Optional[ListNode]):
        """
        Do not return anything, modify head in-place instead.
        """
        mid = self.findMidNode(head)
        l2 = mid.next
        mid.next = None
        l2 = self.reverseLinkList(l2)
        head = self.mergeLinkList(head,l2)
        return head

    def findMidNode(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head:
            return None
        # 定义快慢指针
        fast = head
        slow = head
        # # 快指针每次走两步,需要next存在才能
        # while fast and fast.next:
        #     fast = fast.next.next
        #     slow = slow.next
        # # 当节点为偶数时,slow指向中间右侧节点,fast指向尾节点后的空位置 ;当节点为奇数时,slow指向中间节点,fast指向尾节点
        # return slow

        while fast.next and fast.next.next:
            fast = fast.next.next
            slow = slow.next
        # 当节点为偶数时,slow指向中间左侧节点,fast指向尾节点 ;当节点为奇数时,slow指向中间节点,fast指向尾节点前第两个节点
        return slow
    def reverseLinkList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head:
            return None
        # 当前节点
        cur = head.next
        head.next = None
        while cur:
            later = cur.next
            cur.next = head
            head = cur
            cur = later
        return head

    def mergeLinkList(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        head = l1
        while l1 and l2:
            p = l1.next
            q = l2.next
            l1.next = l2
            l2.next = p
            l1 = p
            l2 = q
        return head

if __name__ == '__main__':
    nums = [1, 2, 3, 4]
    head = ListNode(1,ListNode(2,ListNode(3,ListNode(4))))
    s = Solution()
    res = s.reorderList(head)
    while res:
        print(res.val)
        res = res.next

Python

python 复制代码
from typing import Optional
# 重排链表
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
class Solution:
    def reorderList(self, head: Optional[ListNode]):
        """
        Do not return anything, modify head in-place instead.
        """
        mid = self.findMidNode(head)
        l2 = mid.next
        mid.next = None
        l2 = self.reverseLinkList(l2)
        head = self.mergeLinkList(head,l2)
        return head

    def findMidNode(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head:
            return None
        # 定义快慢指针
        fast = head
        slow = head
        # # 快指针每次走两步,需要next存在才能
        # while fast and fast.next:
        #     fast = fast.next.next
        #     slow = slow.next
        # # 当节点为偶数时,slow指向中间右侧节点,fast指向尾节点后的空位置 ;当节点为奇数时,slow指向中间节点,fast指向尾节点
        # return slow

        while fast.next and fast.next.next:
            fast = fast.next.next
            slow = slow.next
        # 当节点为偶数时,slow指向中间左侧节点,fast指向尾节点 ;当节点为奇数时,slow指向中间节点,fast指向尾节点前第两个节点
        return slow
    def reverseLinkList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head:
            return None
        # 当前节点
        cur = head.next
        head.next = None
        while cur:
            later = cur.next
            cur.next = head
            head = cur
            cur = later
        return head

    def mergeLinkList(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        head = l1
        while l1 and l2:
            p = l1.next
            q = l2.next
            l1.next = l2
            l2.next = p
            l1 = p
            l2 = q
        return head

if __name__ == '__main__':
    nums = [1, 2, 3, 4]
    head = ListNode(1,ListNode(2,ListNode(3,ListNode(4))))
    s = Solution()
    res = s.reorderList(head)
    while res:
        print(res.val)
        res = res.next

删除链表的倒数第N个结点(leetcode19)

C++

cpp 复制代码
// 删除链表的倒数第N个结点
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 *removeNthFromEnd(ListNode *head, int n) {
        if (head->next == nullptr) return nullptr;
        // 定义前后指针
        ListNode *front = head;
        ListNode *behind = head;
        // 前指针先走n步
        for(int i=0;i<n;i++){
            front = front->next;
        }
        // 如果front成了空指针,那么要删除的为头节点
        if(front== nullptr) return head->next;
        // 同步移动前后指针,前指针最多走到最尾节点,后指针便走到删除节点的前一个节点
        while(front && front->next){
            front = front->next;
            behind = behind->next;
        }
        // 删除节点
        behind->next = behind->next->next;
        return head;
    }
};

Python

python 复制代码
from typing import Optional
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        # 仅有头节点,那么删除头节点
        if not head.next:
            return None
        # 定义前后指针
        front = head
        bebind = head
        # front先走n步
        for _ in range(n):
            front = front.next

        # 如果走到了结尾后,那么删除的是头节点
        if not front:
            return head.next

        # front最多走到链表结尾
        while front and front.next:
            front = front.next
            bebind = bebind.next
        bebind.next = bebind.next.next
        return head

if __name__ == '__main__':
    head = ListNode(1,ListNode(2))
    n = 2
    s = Solution()
    res = s.removeNthFromEnd(head,n)
    while res:
        print(res.val)
        res = res.next

合并区间(leetcode56)

C++

cpp 复制代码
#include <vector>
#include <algorithm>

using namespace std;
// 合并区间
class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        // 仅有一个区间
        if(intervals.size()==1) return intervals;
        // 定义结果数组
        vector<vector<int>> res;
        // 对intervals进行区间左边界排序
        sort(intervals.begin(),intervals.end());
        // 定义初始比较区间边界
        int start = intervals[0][0];
        int end = intervals[0][1];
        for(int i=1;i<intervals.size();i++){
            if(intervals[i][0]>end){
                res.push_back(vector<int>{start,end});
                start = intervals[i][0];
                end = intervals[i][1];
            } else{
                end = max(end,intervals[i][1]);
            }
        }
        res.push_back(vector<int>{start,end});
        return res;
    }
};

Python

python 复制代码
from typing import List
# 合并区间
class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        if len(intervals)==1:
            return intervals
        # 定义结果
        res = []
        # 先对区间按左边界进行排序
        intervals.sort()
        # 定义初始比较
        start = intervals[0][0]
        end = intervals[0][1]
        # 遍历区间
        for i in intervals[1:]:
            # 无交集
            if i[0]>end:
                res.append([start,end])
                start = i[0]
                end = i[1]
            else:
                end = max(end,i[1])
        res.append([start,end])
        return res

if __name__ == '__main__':
    # intervals = [[1, 3], [2, 6], [8, 10], [15, 18]]
    intervals = [[1, 4], [0, 4]]
    s = Solution()
    res = s.merge(intervals)
    print(res)

删除排序链表中的重复元素||(leetcode82)

C++

cpp 复制代码
// 删除排序链表中的重复元素||
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 *deleteDuplicates(ListNode *head) {
        if (head == nullptr) return nullptr;
        if (head->next == nullptr) return head;
        // 定义虚拟头节点
        ListNode *dummy = new ListNode(0, head);
        // 遍历链表的指针
        ListNode *start = dummy;
        // 判断是否是重复元素的指针
        ListNode *end;
        while (start->next) {
            end = start->next;
            while (end->next && end->next->val==end->val) end = end->next;
            if(end==start->next){
                start = start->next;
            } else{
                start->next = end->next;
            }
        }
        head = dummy->next;
        delete dummy;
        return head;
    }
};

Python

python 复制代码
from typing import Optional
# 删除排序链表中的重复元素||
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
class Solution:
    def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head:
            return None
        if not head.next:
            return head
        # 定义虚拟头节点
        dummy = ListNode(0,head)

        # 定义start,end指针。start指向已经去除重复节点的末尾,end用于判断后续是否有重复节点
        start = dummy
        while start.next:
            end = start.next
            while end.next and end.next.val == end.val:
                end = end.next
            if end==start.next:
                start = start.next
            else:
                start.next = end.next
        return dummy.next
相关推荐
好奇龙猫2 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
sp_fyf_20243 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘
香菜大丸3 小时前
链表的归并排序
数据结构·算法·链表
jrrz08283 小时前
LeetCode 热题100(七)【链表】(1)
数据结构·c++·算法·leetcode·链表
oliveira-time3 小时前
golang学习2
算法
南宫生4 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
懒惰才能让科技进步5 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
Ni-Guvara5 小时前
函数对象笔记
c++·算法
泉崎5 小时前
11.7比赛总结
数据结构·算法
你好helloworld5 小时前
滑动窗口最大值
数据结构·算法·leetcode