Skip to content

Instantly share code, notes, and snippets.

@ihordyrman
Created November 8, 2020 11:12
Show Gist options
  • Save ihordyrman/d5cdc92936d0f31f1e237b9e7182ebc8 to your computer and use it in GitHub Desktop.
Save ihordyrman/d5cdc92936d0f31f1e237b9e7182ebc8 to your computer and use it in GitHub Desktop.
Sorting for LinkedList
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