问题描述: 实现链表的排序(升序),两个有序链表的合并:A=A∪B,要求合并后仍
时间: 2024-01-22 12:18:08 浏览: 69
保持升序排列。
解决方案:
链表的排序可以使用冒泡排序、插入排序、选择排序等算法,这里我们采用插入排序的方法实现。
插入排序的基本思路是:将未排序的元素一个一个插入到已排序的序列中,直到所有元素都被排序为止。
具体实现过程如下:
1. 定义一个新的链表,作为排序后的结果链表。
2. 遍历原链表,依次取出每个结点,将其插入到新链表中的合适位置。
3. 插入结点时,从新链表的头结点开始遍历,找到第一个比待插入结点大的结点,将待插入结点插入到该结点的前面。
4. 将所有结点都插入到新链表中后,返回新链表的头结点即为排序后的链表。
两个有序链表的合并可以使用归并排序的思想,将两个有序链表分别按照升序排列,然后再将它们合并成一个有序链表。
具体实现过程如下:
1. 定义一个新的链表,作为合并后的结果链表。
2. 分别遍历两个有序链表,比较它们的结点大小,将小的结点插入到新链表中。
3. 如果其中一个链表已经遍历完了,将另一个链表剩余的结点直接插入到新链表中。
4. 返回新链表的头结点即为合并后的有序链表。
示例代码如下(以排序为例):
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def sortList(head: ListNode) -> ListNode:
if not head or not head.next:
return head
# 定义一个新链表作为结果链表
dummy = ListNode(0)
dummy.next = head
cur = head.next
head.next = None
# 遍历原链表
while cur:
next = cur.next
pre = dummy
while pre.next and pre.next.val < cur.val:
pre = pre.next
cur.next = pre.next
pre.next = cur
cur = next
return dummy.next
def mergeTwoLists(l1: ListNode, l2: ListNode) -> ListNode:
dummy = ListNode(0)
cur = dummy
while l1 and l2:
if l1.val <= l2.val:
cur.next = l1
l1 = l1.next
else:
cur.next = l2
l2 = l2.next
cur = cur.next
if l1:
cur.next = l1
else:
cur.next = l2
return dummy.next
```
以上代码实现了链表的排序和两个有序链表的合并,时间复杂度都是 O(nlogn),其中 n 是链表的长度。
阅读全文