链表合并。题目描述\n\n题目内容:已知单链表la=(a1,a2,…,am)和lb=(b1,b2,…,bn),编写程序按以下规则将它们合并成一个单链表lc,要求新表 lc利用原表的存储空间。
时间: 2023-04-16 11:05:15 浏览: 196
题目要求将两个单链表合并成一个单链表,并且要求新表lc利用原表的存储空间。具体实现方法如下:
1. 遍历链表la,找到最后一个节点,将其next指向链表lb的头节点。
2. 返回链表la的头节点,即为合并后的链表lc。
代码实现如下:
```python
def mergeLinkedList(la, lb):
if not la:
return lb
if not lb:
return la
p = la
while p.next:
p = p.next
p.next = lb
return la
```
其中,la和lb分别为两个单链表的头节点。如果其中一个链表为空,则直接返回另一个链表。否则,遍历链表la,找到最后一个节点,将其next指向链表lb的头节点。最后返回链表la的头节点即可。
相关问题
题目内容:已知单链表LA=(a1,a2,…,am)和LB=(b1,b2,…,bn),编写程序按以下规则将它们合并成一个单链表LC,要求新表 LC利用原表的存储空间。 LC=(a1,b1,…,am,bm,bm+1,…,bn),m<=n 或者 LC=(a1,b1,…,an,bn,an+1,…,am),m>n 输入格式:一行内输入单链表LA中的数据(若干个正整数,之间用空格隔开,并以-1结束) 一行内输入单链表LB的数据(若干个正整数,之间用空格隔开,并以-1结束) 输出格式:一行内输出合并后单链表LC的数据结果,之间用两个分隔符 -- 隔开,结束标志-1不输出。 输入样例:1 3 5 7 -1 2 4 6 -1 输出样例:--1--2--3--4--5--6--7 时间限制:500ms内存限制:32000kb
以下是实现该算法的Python代码:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def merge_linked_lists(head1: ListNode, head2: ListNode) -> ListNode:
dummy = ListNode()
tail = dummy
while head1 and head2:
tail.next = head1
head1 = head1.next
tail = tail.next
tail.next = head2
head2 = head2.next
tail = tail.next
if head1:
tail.next = head1
if head2:
tail.next = head2
return dummy.next
# 输入单链表 LA 中的数据
inputs1 = list(map(int, input().split()))[:-1]
# 建立单链表 LA
dummy1 = ListNode()
tail1 = dummy1
for val in inputs1:
tail1.next = ListNode(val)
tail1 = tail1.next
head1 = dummy1.next
# 输入单链表 LB 中的数据
inputs2 = list(map(int, input().split()))[:-1]
# 建立单链表 LB
dummy2 = ListNode()
tail2 = dummy2
for val in inputs2:
tail2.next = ListNode(val)
tail2 = tail2.next
head2 = dummy2.next
# 合并单链表 LA 和 LB
new_head = merge_linked_lists(head1, head2)
# 输出合并后的单链表数据
while new_head:
print('--', new_head.val, end='')
new_head = new_head.next
print()
```
其中,`merge_linked_lists` 函数实现了两个单链表的合并操作,它接受两个链表头结点作为输入,返回合并后的链表头结点。建立原单链表的部分使用了哑结点(dummy node)技巧,最后将其丢弃即可。
逆置单链表。题目描述\n\n题目内容:一个单链表l=(a1 , a2 , … , an-1 , an),其逆单链表定义为l’=( an , an-1 , … , a2 , a1),编写算法将单链表l逆置,
思路:使用三个指针,分别指向当前节点、前一个节点和后一个节点,依次遍历链表,将当前节点的next指向前一个节点,然后将三个指针依次向后移动一个节点,直到遍历完整个链表。
代码实现:
```
void reverseList(ListNode* head) {
if (head == NULL || head->next == NULL) {
return;
}
ListNode* pre = NULL;
ListNode* cur = head;
ListNode* next = NULL;
while (cur != NULL) {
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
head = pre;
}
```