实现链表的排序(升序) 2)实现两个有序链表的合并:A=A∪B,要求合并后仍然有序
时间: 2023-07-11 17:20:54 浏览: 135
双链表实现链表排序,合并等操作
好的,针对你的问题,我来分别回答:
1. 实现链表的排序(升序):
链表的排序可以采用插入排序、归并排序、快速排序等方式,这里我给出一种基于插入排序的实现方式。
具体思路是,从链表头部开始,每次取出一个节点,然后将其插入到已排好序的节点序列中。这里需要新建一个链表用于存储已排好序的节点,最终将其链接到一起即可。
下面是代码实现:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def insertion_sort_list(head: ListNode) -> ListNode:
dummy = ListNode(0) # 新建一个链表用于存储已排好序的节点
curr = head
while curr:
prev = dummy
next_node = dummy.next
while next_node:
if next_node.val > curr.val:
break
prev = next_node
next_node = next_node.next
next_curr = curr.next
curr.next = next_node
prev.next = curr
curr = next_curr
return dummy.next
```
2. 实现两个有序链表的合并:
此处要求合并后仍然有序,因此可以考虑采用双指针的方式,分别遍历两个链表,将较小的节点插入到新链表中,最终将剩余的节点链接到新链表尾部即可。
下面是代码实现:
```python
def merge_two_lists(l1: ListNode, l2: ListNode) -> ListNode:
dummy = ListNode(0)
curr = dummy
while l1 and l2:
if l1.val <= l2.val:
curr.next = l1
l1 = l1.next
else:
curr.next = l2
l2 = l2.next
curr = curr.next
if l1:
curr.next = l1
if l2:
curr.next = l2
return dummy.next
```
希望我的回答对你有所帮助!
阅读全文