将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
这个题吧我觉得可以用双指针的办法 ,创建一个新的链表,通过比较两个链表的节点值来选择较小的节点,从而确保合并后的链表依然是升序的。
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
# 创建一个哨兵节点,方便操作
dummy = ListNode(0)
current = dummy
# 遍历两个链表
while l1 and l2:
if l1.val < l2.val:
current.next = l1 # 选择 l1 节点
l1 = l1.next
else:
current.next = l2 # 选择 l2 节点
l2 = l2.next
current = current.next
if l1:
current.next = l1
elif l2:
current.next = l2
return dummy.next
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
// 创建一个哨兵节点
ListNode* dummy = new ListNode(0);
ListNode* current = dummy;
// 遍历两个链表
while (l1 && l2) {
if (l1->val < l2->val) {
current->next = l1; // 选择 l1 节点
l1 = l1->next;
} else {
current->next = l2; // 选择 l2 节点
l2 = l2->next;
}
current = current->next;
}
// 连接剩余的节点
if (l1) {
current->next = l1;
} else if (l2) {
current->next = l2;
}
return dummy->next; // 返回合并后的链表
}
};
给你一个长度为 n
的链表,每个节点包含一个额外增加的随机指针 random
,该指针可以指向链表中的任何节点或空节点。
构造这个链表的 深拷贝。 深拷贝应该正好由 n
个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next
指针和 random
指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。
例如,如果原链表中有 X
和 Y
两个节点,其中 X.random --> Y
。那么在复制链表中对应的两个节点 x
和 y
,同样有 x.random --> y
。
返回复制链表的头节点。
用一个由 n
个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index]
表示:
val
:一个表示Node.val
的整数。random_index
:随机指针指向的节点索引(范围从0
到n-1
);如果不指向任何节点,则为null
。
你的代码 只 接受原链表的头节点 head
作为传入参数。
这个题目吧,我觉得得多设置一些节点,在原链表的每个节点后面插入一个新节点。新节点的值与原节点相同。
这里引用了大佬的代码,我确实不太会这道题,但是看了大佬的解题,醍醐灌顶啊!
作者:Krahets!!
class Solution:
def copyRandomList(self, head: 'Node') -> 'Node':
cur = head
dum = pre = Node(0)
while cur:
node = Node(cur.val) # 复制节点 cur
pre.next = node # 新链表的 前驱节点 -> 当前节点
# pre.random = '???' # 新链表的 「 前驱节点 -> 当前节点 」 无法确定
cur = cur.next # 遍历下一节点
pre = node # 保存当前新节点
return dum.next