题目:合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。实例输入:1->2->4, 1->3->4输出:1->1->2->3->4->4
题解
思路一
直接求解。创建一个新的哨兵节点,采用双指针操作对该链表对两个链表中的元素进行遍历。当其中一个链表遍历完毕后,将结果链表的下一跳链接至未完成遍历的链表的后续部分即可。
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: if l1 == None and l2 != None: return l2 if l2 == None and l1 != None: return l1 if l1 == None and l2 == None: return None new_node = head = ListNode(None) while True: if l1.val < l2.val: new_node.next = ListNode(l1.val) new_node = new_node.next l1 = l1.next elif l1.val > l2.val: new_node.next = ListNode(l2.val) new_node = new_node.next l2 = l2.next elif l1.val == l2.val: new_node.next = ListNode(l1.val) new_node.next.next = ListNode(l2.val) new_node = new_node.next.next l1 = l1.next l2 = l2.next if l1 == None and l2 != None: # print("进入1") new_node.next = l2 break elif l1 != None and l2 == None: # print("进入2") new_node.next = l1 break elif l1 == None and l2 == None: # print("进入3") break return head.next
执行结果
思路二
由于给定的链表是一个单向链表,题目中仅要求有序,因此只需要将两张列表中的值获得并排序后直接创造节点即可。
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: r_list = [] while l1 and l2: if l1.val < l2.val: r_list.append(l1.val) l1 = l1.next else: r_list.append(l2.val) l2 = l2.next for rest_l in [l1, l2]: while rest_l: r_list.append(rest_l.val) rest_l = rest_l.next if r_list: r_list_node = ListNode(x=r_list[0]) temp_node = r_list_node for ind in range(1, len(r_list)): num = r_list[ind] temp_node.next = ListNode(x=num) temp_node = temp_node.next return r_list_node else: return None
执行结果
思路三
遍历比较后直接连接链表,一次遍历即可得出结果。如下图:
(图来自LeetCode官方)
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: dummyHead = ListNode(-1) p = dummyHead while True: if l1 is None: p.next = l2 return dummyHead.next if l2 is None: p.next = l1 return dummyHead.next if l1.val <= l2.val: p.next = l1 l1 = l1.next else: p.next = l2 l2 = l2.next p = p.next
执行结果
终于等到你,请关注我吧~