public LinkedListNodeSM AddTwoLinkedListTogetherSm(LinkedListSM linkedListSm, LinkedListSM linkedListSm2)
        {
            LinkedListNodeSM result     = new LinkedListNodeSM(-1);
            LinkedListNodeSM resulthead = result;

            int carryOver = 0;

            while (linkedListSm.Head != null || linkedListSm2.Head != null)
            {
                int sum = (linkedListSm.Head?.Data ?? 0) + (linkedListSm2.Head?.Data ?? 0) + carryOver;
                int d   = sum % 10;
                carryOver   = sum / 10;
                result.Next = new LinkedListNodeSM(d);
                if (linkedListSm.Head != null)
                {
                    linkedListSm.Head = linkedListSm.Head.Next;
                }
                if (linkedListSm2.Head != null)
                {
                    linkedListSm2.Head = linkedListSm2.Head.Next;
                }
                result = result.Next;
            }
            if (carryOver > 0)
            {
                result.Next = new LinkedListNodeSM(carryOver);
            }
            return(resulthead.Next);
        }
        public bool DetectAndRemoveLoopSm(LinkedListSM linkedListSM)
        {
            LinkedListNodeSM slow = linkedListSM.Head;
            LinkedListNodeSM fast = linkedListSM.Head;

            while (slow != null && fast != null && fast.Next != null)
            {
                slow = slow.Next;
                fast = fast.Next.Next;
                if (slow == fast)
                {
                    removeLoop(slow, linkedListSM.Head);
                    return(true);
                }
            }
            return(false);
        }
        public LinkedListNodeSM MergeTwoSortedLinkedListSm(LinkedListSM linkedListSm, LinkedListSM linkedListSm2)
        {
            LinkedListNodeSM headFirst  = linkedListSm.Head;
            LinkedListNodeSM headSecond = linkedListSm2.Head;
            LinkedListNodeSM dummy      = new LinkedListNodeSM(-1);
            LinkedListNodeSM dummyHead  = dummy;

            while (headFirst != null && headSecond != null)
            {
                if (headFirst.Data < headSecond.Data)
                {
                    dummy.Next = headFirst;
                    headFirst  = headFirst.Next;
                }
                else
                {
                    dummy.Next = headSecond;
                    headSecond = headSecond.Next;
                }
                dummy = dummy.Next;
            }

            while (headFirst != null)
            {
                dummy.Next = headFirst;
                headFirst  = headFirst.Next;
                dummy      = dummy.Next;
            }

            while (headSecond != null)
            {
                dummy.Next = headSecond;
                headSecond = headSecond.Next;
                dummy      = dummy.Next;
            }

            return(dummyHead.Next);
        }