برنامه نویسی

LEETCODE 148: لیست مرتب سازی

https://leetcode.com/problems/sort-list/description/

با توجه به رئیس یک لیست مرتبط ، لیست را پس از مرتب سازی آن به ترتیب صعودی برگردانید.

مثال 1:

ورودی: سر = [4,2,1,3]خروجی: [1,2,3,4]مثال 2:

ورودی: سر = [-1,5,3,4,0]خروجی: [-1,0,3,4,5]مثال 3:

ورودی: سر = []خروجی: []

تعداد گره های موجود در لیست در محدوده است [0, 5 * 104]بشر
-10^5 <= node.val <= 10^5

این اساساً برای مرتب کردن لیست مرتبط با استفاده از روش مرتب سازی است. ما می توانیم این مورد را در یک لیست ذخیره کنیم ، آن را با استفاده از یک عملکرد کتابخانه مرتب کنیم و لیست مرتبط را بازسازی کنیم. این درست است ، اما ما کاملاً از این واقعیت استفاده نمی کنیم که سوال برای یک لیست مرتبط است.
ما فقط می توانیم از نوع ادغام استفاده کنیم ، مشابه مفهوم مرتب سازی در آرایه ها ، یعنی تقسیم و فاتح.

  • آرایه را طی کنید و با استفاده از روش اشاره گر آهسته و سریع ، وسط لیست مرتبط را پیدا کنید تا بین قسمت چپ و قسمت راست تمایز قائل شود.
  • این کار را به صورت بازگشتی انجام دهید و سپس لیست مرتبط را ادغام کنید.
  • ادغام لیست مرتبط شامل مقایسه مقادیر گره بین قسمت چپ و راست است.
  • به جای ایجاد یک لیست پیوند جدید برای ذخیره نتیجه ، از لیست مرتبط استفاده کنید.
/**
 * 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 previous = null;
        ListNode slow = head;
        ListNode fast = head;
        while (fast != null && fast.next != null) {
            previous = slow;
            slow = slow.next;
            fast = fast.next.next;
        }
        previous.next = null;
        ListNode leftPart = sortList(head);
        ListNode rightPart = sortList(slow);
        ListNode merged = mergeLinkedList(leftPart, rightPart);
        return merged;
    }

    private ListNode mergeLinkedList(ListNode left, ListNode right) {
        if (left == null && right == null) {
            return null;
        }
        if (left == null) {
            return right;
        }
        if (right == null) {
            return left;
        }
        ListNode leftPointer = left;
        ListNode rightPointer = right;
        ListNode result = new ListNode(0);
        ListNode current = result;
        while (leftPointer != null && rightPointer != null) {
            if (leftPointer.val <= rightPointer.val) {
                current.next = leftPointer;
                leftPointer = leftPointer.next;
                current = current.next;
            }
            else {
                current.next = rightPointer;
                rightPointer = rightPointer.next;
                current = current.next;
            }
        }
        if (leftPointer != null) {
            current.next = leftPointer;
                current = current.next;
        }
        else if (rightPointer != null) {
            current.next = rightPointer;
                current = current.next;
        }
        return result.next;
    }
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا