返回介绍

lcof2 / 剑指 Offer II 077. 链表排序 / README

发布于 2024-06-17 01:04:41 字数 8078 浏览 0 评论 0 收藏 0

剑指 Offer II 077. 链表排序

题目描述

给定链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表

     

    示例 1:

    输入:head = [4,2,1,3]
    输出:[1,2,3,4]
    

    示例 2:

    输入:head = [-1,5,3,4,0]
    输出:[-1,0,3,4,5]
    

    示例 3:

    输入:head = []
    输出:[]
    

     

    提示:

    • 链表中节点的数目在范围 [0, 5 * 104] 内
    • -105 <= Node.val <= 105

     

    进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?

     

    注意:本题与主站 148 题相同:https://leetcode.cn/problems/sort-list/

    解法

    方法一

    # Definition for singly-linked list.
    # class ListNode:
    #   def __init__(self, val=0, next=None):
    #     self.val = val
    #     self.next = next
    class Solution:
      def sortList(self, head: ListNode) -> ListNode:
        if head is None or head.next is None:
          return head
        slow, fast = head, head.next
        while fast and fast.next:
          slow, fast = slow.next, fast.next.next
        t = slow.next
        slow.next = None
        l1, l2 = self.sortList(head), self.sortList(t)
        dummy = ListNode()
        cur = dummy
        while l1 and l2:
          if l1.val <= l2.val:
            cur.next = l1
            l1 = l1.next
          else:
            cur.next = l2
            l2 = l2.next
          cur = cur.next
        cur.next = l1 or l2
        return dummy.next
    
    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *   int val;
     *   ListNode next;
     *   ListNode() {}
     *   ListNode(int val) { this.val = val; }
     *   ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     * }
     */
    class Solution {
      public ListNode sortList(ListNode head) {
        if (head == null || head.next == null) {
          return head;
        }
        ListNode slow = head, fast = head.next;
        while (fast != null && fast.next != null) {
          slow = slow.next;
          fast = fast.next.next;
        }
        ListNode t = slow.next;
        slow.next = null;
        ListNode l1 = sortList(head);
        ListNode l2 = sortList(t);
        ListNode dummy = new ListNode();
        ListNode cur = dummy;
        while (l1 != null && l2 != null) {
          if (l1.val <= l2.val) {
            cur.next = l1;
            l1 = l1.next;
          } else {
            cur.next = l2;
            l2 = l2.next;
          }
          cur = cur.next;
        }
        cur.next = l1 == null ? l2 : l1;
        return dummy.next;
      }
    }
    
    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *   int val;
     *   ListNode *next;
     *   ListNode() : val(0), next(nullptr) {}
     *   ListNode(int x) : val(x), next(nullptr) {}
     *   ListNode(int x, ListNode *next) : val(x), next(next) {}
     * };
     */
    class Solution {
    public:
      ListNode* sortList(ListNode* head) {
        if (!head || !head->next) return head;
        auto* slow = head;
        auto* fast = head->next;
        while (fast && fast->next) {
          slow = slow->next;
          fast = fast->next->next;
        }
        auto* t = slow->next;
        slow->next = nullptr;
        auto* l1 = sortList(head);
        auto* l2 = sortList(t);
        auto* dummy = new ListNode();
        auto* cur = dummy;
        while (l1 && l2) {
          if (l1->val <= l2->val) {
            cur->next = l1;
            l1 = l1->next;
          } else {
            cur->next = l2;
            l2 = l2->next;
          }
          cur = cur->next;
        }
        cur->next = l1 ? l1 : l2;
        return dummy->next;
      }
    };
    
    /**
     * Definition for singly-linked list.
     * type ListNode struct {
     *   Val int
     *   Next *ListNode
     * }
     */
    func sortList(head *ListNode) *ListNode {
      if head == nil || head.Next == nil {
        return head
      }
      slow, fast := head, head.Next
      for fast != nil && fast.Next != nil {
        slow, fast = slow.Next, fast.Next.Next
      }
      t := slow.Next
      slow.Next = nil
      l1, l2 := sortList(head), sortList(t)
      dummy := &ListNode{}
      cur := dummy
      for l1 != nil && l2 != nil {
        if l1.Val <= l2.Val {
          cur.Next = l1
          l1 = l1.Next
        } else {
          cur.Next = l2
          l2 = l2.Next
        }
        cur = cur.Next
      }
      if l1 != nil {
        cur.Next = l1
      } else {
        cur.Next = l2
      }
      return dummy.Next
    }
    
    /**
     * Definition for singly-linked list.
     * class ListNode {
     *   val: number
     *   next: ListNode | null
     *   constructor(val?: number, next?: ListNode | null) {
     *     this.val = (val===undefined ? 0 : val)
     *     this.next = (next===undefined ? null : next)
     *   }
     * }
     */
    
    function sortList(head: ListNode | null): ListNode | null {
      if (head == null || head.next == null) return head;
      // 快慢指针定位中点
      let slow: ListNode = head,
        fast: ListNode = head.next;
      while (fast != null && fast.next != null) {
        slow = slow.next;
        fast = fast.next.next;
      }
      // 归并排序
      let mid: ListNode = slow.next;
      slow.next = null;
      let l1: ListNode = sortList(head);
      let l2: ListNode = sortList(mid);
      let dummy: ListNode = new ListNode();
      let cur: ListNode = dummy;
      while (l1 != null && l2 != null) {
        if (l1.val <= l2.val) {
          cur.next = l1;
          l1 = l1.next;
        } else {
          cur.next = l2;
          l2 = l2.next;
        }
        cur = cur.next;
      }
      cur.next = l1 == null ? l2 : l1;
      return dummy.next;
    }
    
    /**
     * Definition for singly-linked list.
     * function ListNode(val, next) {
     *   this.val = (val===undefined ? 0 : val)
     *   this.next = (next===undefined ? null : next)
     * }
     */
    /**
     * @param {ListNode} head
     * @return {ListNode}
     */
    var sortList = function (head) {
      if (!head || !head.next) {
        return head;
      }
      let slow = head;
      let fast = head.next;
      while (fast && fast.next) {
        slow = slow.next;
        fast = fast.next.next;
      }
      let t = slow.next;
      slow.next = null;
      let l1 = sortList(head);
      let l2 = sortList(t);
      const dummy = new ListNode();
      let cur = dummy;
      while (l1 && l2) {
        if (l1.val <= l2.val) {
          cur.next = l1;
          l1 = l1.next;
        } else {
          cur.next = l2;
          l2 = l2.next;
        }
        cur = cur.next;
      }
      cur.next = l1 || l2;
      return dummy.next;
    };
    
    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *   public int val;
     *   public ListNode next;
     *   public ListNode(int val=0, ListNode next=null) {
     *     this.val = val;
     *     this.next = next;
     *   }
     * }
     */
    public class Solution {
      public ListNode SortList(ListNode head) {
        if (head == null || head.next == null)
        {
          return head;
        }
        ListNode slow = head, fast = head.next;
        while (fast != null && fast.next != null)
        {
          slow = slow.next;
          fast = fast.next.next;
        }
        ListNode t = slow.next;
        slow.next = null;
        ListNode l1 = SortList(head);
        ListNode l2 = SortList(t);
        ListNode dummy = new ListNode();
        ListNode cur = dummy;
        while (l1 != null && l2 != null)
        {
          if (l1.val <= l2.val)
          {
            cur.next = l1;
            l1 = l1.next;
          }
          else
          {
            cur.next = l2;
            l2 = l2.next;
          }
          cur = cur.next;
        }
        cur.next = l1 == null ? l2 : l1;
        return dummy.next;
      }
    }
    

    如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

    扫码二维码加入Web技术交流群

    发布评论

    需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
    列表为空,暂无数据
      我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
      原文