21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = [] 输出:[]
示例 3:
输入:l1 = [], l2 = [0] 输出:[0]
提示:
- 两个链表的节点数目范围是
[0, 50]
-100 <= Node.val <= 100
l1
和l2
均按 非递减顺序 排列
文章目录
思路
参考:
解题方法
为了更方便的进行合并,有必要创建一个伪节点/哨兵节点( dummy = curr = ListNode()),以哨兵节点开始进行双链表的合并。哨兵节点 (dummy)实际上一个常见的链表处理技巧。创建一个哨兵(或称哑节点)节点 dummy,使得链表操作更加简化,因为我们不需要单独处理空链表的情况。此节点不存储任何实际数据,但其 next 指针会指向合并后链表的头节点;
当某一个链表遍历完,则可以终止迭代,并将另一个链表直接加在合并过的链表后面;
清楚在迭代中链表合并过程里的coding细节,比如:节点通过指针实现合并(curr.next = list1),节点通过指针实现移动(list2 = list2.next);
链表的操作均通过节点实现,list1和list2作为节点均可以移动。
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]: dummy = curr = ListNode() # 构建哨兵节点,方便链表合并 while list1 and list2: # 当list1或list2有一个遍历完则停止 if list1.val < list2.val: # 合并list1节点 curr.next, list1 = list1, list1.next # 比下面的写法更简练 else: # 合并list2节点 curr.next = list2 # 合并节点 list2 = list2.next # 移动节点 curr = curr.next # 移动curr节点 curr.next = list1 if list1 else list2 return dummy.next # 返回哨兵节点后的链表,即为合并链表
标签:curr,list1,next,链表,有序,leetcode.21,list2,节点 From: https://www.cnblogs.com/chenxiaomeng/p/18073595