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
Post a Comment