NO.21合并俩个有序链表
#递归解法 class Solution: def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]: if not list1: return list2#递归的终止条件 if not list2: return list1 if list1.val<list2.val: list1.next = self.mergeTwoLists(list1.next,list2) #python中需要self.引用 return list1 else: list2.next = self.mergeTwoLists(list2.next,list1) return list2
#双指针解法 #采用第一种dummy作为链表头结点 class Solution: def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]: dummy = ListNode() #设置虚拟节点 cur = dummy #遍历节点和虚拟节点指向同一处 while list1 and list2:# 遍历条件list1,list2都不为空 if list1.val <= list2.val: cur.next = list1 cur = cur.next list1 = list1.next else: cur.next = list2 cur = cur.next list2 = list2.next if list1:#如果剩余list1不为空 cur.next = list1 if list2:#如果剩余list2不为空 cur.next = list2 return dummy.next
总结一下dummy节点 1->2->3->4->5 head在1的位置,有一个指针n也在头部 为解决问题,设置虚假节点dummy,指向一个假的节点,设为0(这个不重要,一般不会读取) dummy.next指向1,即转为 0->1->2->3->4->5,因此最后return dummy.next是原链表 而加入dummy后,自己的指针n也不指向头部1,而是指向0-dummy这个位置 遍历链表---while(n==null) dummy节点的作用:作为新链表的头结点 解决链表头部的极端情况