ZhangZhihui's Blog  

You are given an array of k linked-lists lists, each linked-list is sorted in ascending order.

Merge all the linked-lists into one sorted linked-list and return it.

 

Example 1:

Input: lists = [[1,4,5],[1,3,4],[2,6]]
Output: [1,1,2,3,4,4,5,6]
Explanation: The linked-lists are:
[
  1->4->5,
  1->3->4,
  2->6
]
merging them into one sorted list:
1->1->2->3->4->4->5->6

Example 2:

Input: lists = []
Output: []

Example 3:

Input: lists = [[]]
Output: []

 

Constraints:

  • k == lists.length
  • 0 <= k <= 104
  • 0 <= lists[i].length <= 500
  • -104 <= lists[i][j] <= 104
  • lists[i] is sorted in ascending order.
  • The sum of lists[i].length will not exceed 104.

 

My Solution:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
        if not lists:
            return None
        
        def merge_2_lists(l1, l2):
            if not l1 and not l2:
                return None
            elif not l1 or not l2:
                return l1 if l1 else l2
            else:
                head = l1 if l1.val <= l2.val else l2
                left = head
                right = l2 if left == l1 else l1
                prev_left = None

                while left and right:
                    if left.val < right.val:
                        prev_left = left
                        left = left.next
                    elif left.val == right.val:
                        prev_left = left
                        left_next = left.next
                        right_next = right.next
                        left.next = right
                        right.next = left_next
                        left = right
                        right = right_next
                    elif left.val > right.val:
                        right_next = right.next
                        prev_left.next = right
                        right.next = left
                        prev_left = right
                        right = right_next
                
                if right:
                    prev_left.next = right

                return head
        
        head = lists[0]
        for i in range(1, len(lists)):
            head = merge_2_lists(head, lists[i])
        
        return head

 

 

ChatGPT's Solution:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
        if not lists:
            return None
        
        def merge_2_lists(l1, l2):
            if not l1 or not l2:
                return l1 or l2
            
            dummy = ListNode()
            tail = dummy

            while l1 and l2:
                if l1.val < l2.val:
                    tail.next, l1 = l1, l1.next
                else:
                    tail.next, l2 = l2, l2.next
                tail = tail.next
            
            tail.next = l1 or l2
            return dummy.next
        
        while len(lists) > 1:
            merged_lists = []
            for i in range(0, len(lists), 2):
                l1 = lists[i]
                l2 = lists[i + 1] if i + 1 < len(lists) else None
                merged_lists.append(merge_2_lists(l1, l2))
            lists = merged_lists
        
        return lists[0]

 

posted on 2025-04-02 12:38  ZhangZhihuiAAA  阅读(9)  评论(0)    收藏  举报