题干(5月1日每日一题)
21. 合并两个有序链表
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路
比较基础的链表操作练习,两种思路。
- 新建立一个链表,把
l1,l2
中较小的一个链接到新链表的后面 - 固定
l1
, 把l2
的结点插入l1 中
考虑到这道题比较基础,所以将新手操作链表需要注意的点写一下,理解透了这两点,链表操作不是问题。
-
假设有链表
x->y
, 也就是x.next = y
当你对x.next
进行赋值时,其修改的并不是y
,而是x
的next
指针,这样做并不会对y
结点产生任何影响,它只是对x
结点的后继结点进行更换这也是很多新手操作链表存在的误区
每个结点只有一个
next
,也就是说一旦一个结点的next
被修改,其改动之前的next
如果不做记录便会断掉
- python 代码1, 对应思路1
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
p1, p2 = l1, l2
head = ListNode(None)
p = head
while p1 and p2:
if p1.val < p2.val:
p.next = p1
p1 = p1.next
p = p.next
else:
p.next = p2
p2 = p2.next
p = p.next
if p1:
p.next = p1
if p2:
p.next = p2
return head.next
- python 代码2,对应思路2
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
head = ListNode(None)
head.next = l1
pre, p2 = head, l2
while pre.next and p2:
if p2.val < pre.next.val:
temp = p2
p2 = p2.next
temp.next = pre.next
pre.next = temp
pre = pre.next
if p2:
pre.next = p2
return head.next