LeetCode之算法面试之链表4之两两交换链表中的节点(24)、k个一组翻转链表(25)、对链表进行插入排序(147)、排序链表(148)

1、两两交换链表中的节点(24)

题目描述:

【中等题】
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
在这里插入图片描述

题目链接
思路分析

题解一:迭代法

1、创建哑结点 dummyhead,令 dummyhead.next = head。令 p指针 表示当前到达的节点,初始化 p = dummyhead。每次需要交换p 后面的两个节点。

2、如果 temp 的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。否则,获得 p 后面的两个节点 node1 和 node2,通过更新节点的指针关系实现两两交换节点。

3、完成上述操作之后,节点关系即变成 temp -> node2 -> node1。再令 p = node1,对链表中的其余节点进行两两交换,直到全部节点都被两两交换。

4、两两交换链表中的节点之后,新的链表的头节点是 dummyhead.next,返回新的链表的头节点即可。

【python 3 代码实现】

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def swapPairs(self, head: ListNode) -> ListNode:
        dummyhead=ListNode(0) # 建立虚拟节点
        dummyhead.next=head
        p=dummyhead
        while p.next and p.next.next:
            node1=p.next
            node2=node1.next
            node3=node2.next
            node2.next=node1
            node1.next=node3
            p.next=node2
            p=node1
        return dummyhead.next
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

题解二:递归法

二刷的时候更新

2、k个一组翻转链表(25)

题目描述:

【困难题】
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
在这里插入图片描述

题目链接
思路分析

3、对链表进行插入排序(147)

题目描述:

【中等题】
对链表进行插入排序。

插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。
每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。

插入排序算法:

1、插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
2、每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
3、重复直到所有输入数据插入完为止。
在这里插入图片描述

题目链接
思路分析

4、排序链表(148)

题目描述:

【中等题】
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
进阶:
你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?
在这里插入图片描述

题目链接
思路分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值