Skip to main content

1721 - Swapping Nodes in a Linked List.

Hi, Today we will be solving leetcode qs 1721 - Swapping Nodes in a Linked List.

This qs is really simple. We need to swap the nodes placed at k distance from the start and end of the Linked List. So let's suppose you have a Linked List input as follows:

1 -> 2-> 4 -> 5 -> 7 -> 8 -> 10-> 9

 and you are given a k = 2, so the output should be

1 -> 10-> 4 -> 5 -> 7 -> 8 ->2 -> 9

so how do we achieve it???

Intuition

The most brute force solution one can think of is using Array data structure. For that, we will traverse through linked List and store all the elements in the Array, swap the two numbers and again insert it in theLinked List again. Not bad, but let's deal with it, it is not the optimal solution and far from being as an acceptable solution in interviews.

So what can we done instead of that???

Let's try to look deep into the working of Linked List first and how do we traverse it. Linked List is a linear data structure that consists of a value and a next pointer.

This is how we initiate a LinkedList Node:


class LinkedList:
def __init__(self, val):
self.val = val
self.next = None


Here val is the value stored in Linked List and next is the pointer that is used to point to next Node. Currently it is pointing to None.

So in general to access the Linked List Nodes we use pointers. The first node in the linked list is defined as the head and last element is defined as tail. The tail nodes points to None defining that Linked List has ended.

So coming back to the qs, We know that we will be using pointers, here as we need two values kth value from start and end ,  we will be using concept of two pointers

Approach

We will make sure to move a pointer to the point of k and call it firstNode and then iterate over linked list again but this time second pointer secondNode will start from head and our first created pointer will start from its own place which we got from first iteration. and in this iteration we will move our firstNode till the last node of head. This is because when firstNode will hit the last  we will get the secondNode.


firstNode postion = k-1

secondNode position = count -k


Note: To keep the node position in check we will assign another pointer to firstNode and will be moving that in second iteration

Complexity

Space Complexity = O(1)
Time Complexity = O(N)

N is length of the linked list



Solution


class Solution:
def swapNodes(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
if head is None:
return

firstNode = head

for i in range(1, k):
firstNode=firstNode.next

current = firstNode
secondNode = head

while current.next:
secondNode=secondNode.next
current = current.next

firstNode.val, secondNode.val = secondNode.val, firstNode.val

return head



Link to the qs in leetcode.

Comments

Popular posts from this blog

1235. Maximum Profit in Job Scheduling

Hi everyone, Today's post is little bit intriguing to me as it took me some time to get t the solution. I have been out of practice for a bit so I was not able to do it in the DP. I didn't want to copy the code. Though i understood the code after i checked its solution in the discussions. Anyways, i tried to do it with heap and with some thinking I was able to do it and with my surprise It performed real well. I would like to jump to the solution but first I would like to explain a little bit about heaps so you can get better understanding of the code. A heap is like a special type of list where the smallest (or largest) item is always at the front. Think of it like a priority line at a theme park, where the person with the highest priority goes to the front. There are two types of heaps: Min Heap: The smallest item is at the front. It's like standing in a line where the shortest person is always at the front. Max Heap: The largest item is at the front. It's like stand

1456, Maximum Number of Vowels in a Substring of Given Length

Hi, folks today I am here with an interesting coding problem from Leetcode. *To directly go to the question please click here. So I will walk through the solution. It will be a brute force and an optimized way solution. I will be explaining the optimized way solutions in depth. # Intuition For any substring of length k, we need to find how many vowels are there in it and provide the highest count of all counts of vowels in a substring. Test Case 1 Input k = 2 and s='asjdee' Output - 2 Explanation: As for substring of length k=2, in the string 's' we have 'ee' when the length is k and the vowels count is 2 Test Case 2 Input k=3 and s='aasdiisdwe' Output - 2 Explanation - For all the substrings with length k = 3 we have 'aas' and 'dii' with 2 vowels each in it. Brute Force - Looping (twice) - Gives TLE (Not recommended) # Approach Create a hashmap (dictionary) with all the vowels in it. Loop through the string till len(s)-k element of strin

1287. Element Appearing More Than 25% In Sorted Array

Hi, Today i bring you new Leetcode problem. Its an easy one :) The problem is - Element Appearing More Than 25% In Sorted Array As qs. explains itself we need to find a number that appears 25% times or more than the length of he array. So for example if array has length of 8 then the resultant number should appear 2 or more times. The constraints given are - 1 <= arr.length <= 100, 0 <= arr[i] <= 10 5 So, lets look at the cases which we may encounter. 1. if length is 1. then the number itself is the result. 2. if length is divisibe by 4 3. if length is not divisible by 4. Let's look at the code now...  class Solution : def findSpecialInteger ( self , arr : List[ int ]) -> int : n = len (arr) start = 0 end = n hm = defaultdict() for i in arr: hm[i] = hm.get(i, 0 )+ 1 for i in hm: if hm[i]>n// 4 : return i Now we will go through the code. Step 1: Initializatio