LeetCode 合併兩個有序鏈表

合併兩個有序鏈表


題目來源:https://leetcode-cn.com/problems/merge-two-sorted-lists/python

題目


將兩個有序鏈表合併爲一個新的有序鏈表並返回。新鏈表是經過拼接給定的兩個鏈表的全部節點組成的。 segmentfault

示例:微信

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

解題思路


  1. 設定「哨兵節點」,用以正確返回合併後的鏈表;
  2. 控制 cur 指針,調整它的 next 指針;
  3. 比較兩個鏈表的節點大小,將小的節點接在 cur 節點後面;
  4. 循環操做,當其中一個鏈表爲空時終止;
  5. 若循環結束,其中一個鏈表不爲空,則將剩餘部分接在合併鏈表後面(由於兩個鏈表都是有序的,因此剩餘部分都比合並鏈表的元素大;
  6. 最後,返回合併的鏈表。

代碼實現


# # 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:
        '''將兩個有序鏈表合併成一個鏈表而後返回

        Args:
            l1: 有序鏈表 1
            l2: 有序鏈表 2
        
        Returns:
            返回合併後的有序鏈表
        '''
         # 定義一個哨兵節點,用以正確返回合併後的鏈表
        pre_head = ListNode(None)

        # 控制 cur 指針,比較節點大小
        cur = pre_head

        # 比較兩個鏈表的節點大小,當兩個鏈表任意一個爲空,則終止
        while l1 and l2:
            # 當 l1 的節點較小,則指針指向 l1,同時向後移
            if l1.val < l2.val:
                cur.next, l1 = l1, l1.next
            else:  # 不然,指針指向 l2,同時向後移
                cur.next, l2 = l2, l2.next
            # 維護 cur 指針
            cur = cur.next
        # 考慮其中任意一個鏈表爲空,將非空的鏈表拼接在合併鏈表後面
        cur.next = l1 if l1 else l2
        return pre_head.next

實現效果


merge_two_lists_result.jpg

以上爲本篇的主要內容。

結語:祝你們新春大吉,平安喜樂spa

題外話:但願你們作好我的防禦,如非必要,儘可能不出門。指針

歡迎關注微信公衆號《書所集錄》
相關文章
相關標籤/搜索