实习目的:熟练掌握链表的建立及基本操作 问题描述: 1)实现链表的排序(升序) 2)实现两个有序链表的合并:A=A∪B,要求合并后仍然有序。 提交前请将所有的提示信息去掉,只保留最后的输出结果。例如运行时:从键盘直接输入: 2 1 2 3 1 2 3 输出结果为: 1 2 3 分别表示第一个链表元素个数为2,元素分别为 1,2 ;第二个链表元素个数为3,元素分别为1,2,3。
时间: 2024-02-25 14:54:36 浏览: 57
链表的基本操作,适合初学者。
好的,我能理解您的问题。以下是我的回答:
链表排序的实现可以使用插入排序。从链表第二个节点开始遍历,将该节点插入到前面已排好序的链表中的合适位置即可。时间复杂度为O(n^2)。
两个有序链表的合并可以使用归并排序的思想。从两个链表的头节点开始比较,将较小的节点插入新的链表中,直至其中一个链表遍历完毕。然后将剩余的节点直接插入新链表中即可。时间复杂度为O(n)。
以下是具体的实现代码,仅供参考:
```python
#定义链表节点类
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
#插入排序实现链表排序
def sortList(head):
if not head or not head.next:
return head
dummy = ListNode(0)
dummy.next = head
pre = head
cur = head.next
while cur:
if cur.val >= pre.val:
pre = cur
cur = cur.next
else:
pre.next = cur.next
p = dummy
while p.next and p.next.val < cur.val:
p = p.next
cur.next = p.next
p.next = cur
cur = pre.next
return dummy.next
#合并两个有序链表
def mergeTwoLists(l1, l2):
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
if l2:
cur.next = l2
return dummy.next
#从键盘输入两个有序链表并排序合并
if __name__ == '__main__':
n, m = map(int, input().split())
head1 = ListNode(0)
cur = head1
for i in range(n):
temp = ListNode(int(input()))
cur.next = temp
cur = cur.next
head1 = head1.next
head1 = sortList(head1)
head2 = ListNode(0)
cur = head2
for i in range(m):
temp = ListNode(int(input()))
cur.next = temp
cur = cur.next
head2 = head2.next
head2 = sortList(head2)
res = mergeTwoLists(head1, head2)
while res:
print(res.val, end=' ')
res = res.next
```
假设输入为 "2 1 2 3 1 2 3",则输出为 "1 1 2 2 2 3 3"。
阅读全文