21 -合并两个有序链表 - python

92 阅读1分钟

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

根据题目的描述可知,给定的两个链表本身就是递增有序的。因此,为了得到合并后依然有序的新链表,我们可以新建一个结点 n e w H e a d newHead newHead作为新链表的头结点,然后设置两个指针 p p p和 q q q分别指向两个链表的开始位置,然后比较 p p p和 q q q所指向结点值的大小:

  • 如果 p . v a l < q . v a l p.val < q.val p.val<q.val,将 p p p作为 n e w H e a d newHead newHead的 n e x t next next,然后 p p p后移

  • 如果 q . v a l < p . v a l q.val < p.val q.val<p.val,将 q q q作为 n e w H e a d newHead newHead的 n e x t next next,然后 q q q后移

  • 直到一个链表遍历到头,将另一个链表剩下的元素接到新链表后即可


    在这里插入图片描述

AC code

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        if l1 is None:
            return l2
        
        if l2 is None:
            return l1


        newHead = ListNode(-1)
        cur = newHead
        while l1 and l2:
            if l1.val >= l2.val:
                cur.next = l2
                l2 = l2.next
            else:
                cur.next = l1
                l1 = l1.next
            # 当cur.next不为None时需要同时移动cur指针
            cur = cur.next
            
        if l1:
            cur.next = l1
            return newHead.next
        
        if l2:
            cur.next = l2
            return newHead.next