Created
November 8, 2020 11:12
-
-
Save ihordyrman/d5cdc92936d0f31f1e237b9e7182ebc8 to your computer and use it in GitHub Desktop.
Sorting for LinkedList
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
namespace MergeSort_LinkedList | |
{ | |
internal class ListNode | |
{ | |
public int Val { get; set; } | |
public ListNode Next { get; set; } | |
public ListNode(int val = 0, ListNode next = null) | |
{ | |
Val = val; | |
Next = next; | |
} | |
} | |
internal static class Program | |
{ | |
private static void Main() | |
{ | |
var random = new Random(); | |
ListNode head = null; | |
for (var i = 0; i <= 10; i++) | |
head = new ListNode(random.Next(0, 100), head); | |
PrintNodes(head); | |
Console.WriteLine(); | |
Console.WriteLine(new string('-', 30)); | |
head = MergeSort(head); | |
PrintNodes(head); | |
} | |
private static ListNode MergeSort(ListNode head) | |
{ | |
if (head?.Next is null) return head; | |
var arr = SplitNode(head); | |
var left = arr[0]; | |
var right = arr[1]; | |
left = MergeSort(left); | |
right = MergeSort(right); | |
return Merge(left, right); | |
} | |
private static ListNode Merge(ListNode left, ListNode right) | |
{ | |
if (left is null) return right; | |
if (right is null) return left; | |
ListNode mergedList; | |
if (left.Val > right.Val) | |
{ | |
mergedList = right; | |
mergedList.Next = Merge(left, right.Next); | |
} | |
else | |
{ | |
mergedList = left; | |
mergedList.Next = Merge(left.Next, right); | |
} | |
return mergedList; | |
} | |
private static ListNode[] SplitNode(ListNode head) | |
{ | |
if (head?.Next == null) return new[] {head, null}; | |
var left = head; | |
var right = head.Next; | |
while (right != null) | |
{ | |
right = right.Next; | |
if (right != null) | |
{ | |
left = left.Next; | |
right = left.Next; | |
} | |
} | |
ListNode[] arr = {head, left.Next}; | |
left.Next = null; | |
return arr; | |
} | |
private static void PrintNodes(ListNode head) | |
{ | |
while (head != null) | |
{ | |
Console.Write($"{head.Val} "); | |
head = head.Next; | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment