L24. Flattening a LinkedList | Multiple Approaches with Dry Run

Поділитися
Вставка
  • Опубліковано 1 жов 2024
  • Problem Link: tinyurl.com/2p...
    Entire LL Sheet: takeuforward.o...
    Check our A2Z DSA Course: takeuforward.o...
    Please do give us a like, and subscribe to us if you are new to our channel.
    Do follow us on our socials: linktr.ee/take...

КОМЕНТАРІ • 110

  • @rishikeshjadhav4774
    @rishikeshjadhav4774 2 місяці тому +9

    18:12 it should be list1= list1->child;
    rare thing for you to go wrong 😅

  • @lifehustlers164
    @lifehustlers164 9 місяців тому +61

    stack & queue leaao aur strings (basic & medium) please

    • @aayushgakhar3525
      @aayushgakhar3525 4 місяці тому +1

      yes

    • @DURGESHKUMAR-pu4wq
      @DURGESHKUMAR-pu4wq 2 місяці тому +4

      Aa gaya bhai😮

    • @lifehustlers164
      @lifehustlers164 2 місяці тому

      @@DURGESHKUMAR-pu4wq ab to karlia bhai ,in 4th year looking for placements. almost saara course hi hogya ab to

    • @brokegod5871
      @brokegod5871 2 місяці тому +1

      @@lifehustlers164 string kaha se kiye? Heap toh lagta hai aditya verma ka dekhe hoge

    • @studystuff51
      @studystuff51 Місяць тому +1

      @@lifehustlers164 Me in third year and my college is already having placements, worried about whether I will get placed or not

  • @yashkumar-re3by
    @yashkumar-re3by 8 місяців тому +22

    time complexity galat hai bhai. aapne N x O(2 M) liya hai but wo har baar O(2 M) nhi hoga sirf first time hoga. it will be 2M + 3M + 4M +.... + NM = O(M x N^2)

    • @divyanshjain7999
      @divyanshjain7999 3 місяці тому +1

      @striver sir pls reply

    • @akashadak4160
      @akashadak4160 3 місяці тому +2

      Exactly

    • @kanta4402
      @kanta4402 2 місяці тому

      Can you tell me how N^2 comes here with an example

    • @mbm.editzz
      @mbm.editzz 14 днів тому

      @@kanta4402 n*(n+1)/2 * m

  • @ankit_yadav11
    @ankit_yadav11 7 місяців тому +32

    you are the first teacher who have courage to dry run the whole process of how recursion is happenning here , salute you sir u made me understand each and every word of this problem u r the legend

  • @jeetdesaimusic
    @jeetdesaimusic 4 місяці тому +17

    According to me,the time complexity will be like : 2M(for merging last 2 lists) + 3M(for merging last 2 combined and last 3rd) + 4M + ... + NM, taking M common, M(2+3+....N) , which is approximately, M(N)(N+1)/2 = O(M*N^2).

    • @prajitbanerjee8226
      @prajitbanerjee8226 4 місяці тому

      absolutely correct...you can use similar technique you used while solving k sorted linkedlists..

    • @ashtonronald
      @ashtonronald 3 місяці тому

      I think you claim this due to the fact that the size of the final merged list used for backtracking keeps increasing. It is logical & hence correct.

    • @lenovox1carbon664
      @lenovox1carbon664 Місяць тому +4

      Bro corrected striver now u deserve senior engineer position in Microsoft

    • @rahulnegi4027
      @rahulnegi4027 15 днів тому

      nah bro it should be O(n*mlog(n*m))

  • @YogaJournalWithMimansa
    @YogaJournalWithMimansa 2 місяці тому +7

    Amazing explanation! The more I solve these problems, the more I like DSA!! Thanks!!! :)

  • @alessandrocamilleri1239
    @alessandrocamilleri1239 8 місяців тому +13

    Very good explanation. Striver uses a recursive solution which is fine as it is important to brush up on recursion from time to time. For completeness sake this is the iterative solution, which is trivial. The merge function is common to both solutions and is not included.
    Node* flattenLinkedList(Node* head)
    {
    if(head == NULL) return head;
    Node* head2 = head;
    while (head2->next)
    {
    Node* temp = head2;
    head2 = head2->next;
    temp->next = NULL;
    head = mergeLL (head, head2);
    }
    return head;
    }

  • @harharmahadev3115
    @harharmahadev3115 9 місяців тому +18

    Stack and que ki playlist laooo 😅

  • @BeWarrior-dw4br
    @BeWarrior-dw4br 8 місяців тому +6

    bhaiyaa aaaaaa aaaaaaa STACK QUEUE ki playlist laooooooooooooo

  • @JayVishwakarma
    @JayVishwakarma Місяць тому +1

    12:29 the space comp. should be O(n*m) beacuse the new Linkedlist is created in order to return the answer so it is not counted as a space comp.

  • @mahendrachourasiya7444
    @mahendrachourasiya7444 9 місяців тому +8

    Which company can ask this level (very hard) of question? 😅
    btw GREAT EXPLANATION.

  • @robot3.077
    @robot3.077 8 місяців тому +9

    BHAIYA STACK AND QUEUE KI PLAYLIST LAO❣❣

  • @abhishekpanda8833
    @abhishekpanda8833 7 місяців тому +7

    Great explanation. Recursive logic illustration is literally gold mine.

  • @rohithnarasimhaswaminaidup4874
    @rohithnarasimhaswaminaidup4874 6 місяців тому +2

    There is a small mistake in the psuedo code in merge function you wrote list1=list1-next instead of list1->child;
    by the way the dry run and everything were perfect.
    Thanks!!

  • @cenacr007
    @cenacr007 4 місяці тому +1

    Working Coding Ninjas Code if someone else is also getting runtime error:
    Node* merge(Node* list1, Node* list2) {
    Node* dummyNode = new Node(-1);
    Node* res = dummyNode;
    while(list1 != NULL && list2 != NULL) {
    if(list1->data < list2->data) {
    res->child = list1;
    res = list1;
    list1 = list1->child;
    } else {
    res->child = list2;
    res = list2;
    list2 = list2->child;
    }
    res->next = nullptr;
    }
    if(list1) {
    res->child = list1;
    } else {
    res->child = list2;
    }
    if(dummyNode->child) {
    dummyNode->child->next = nullptr;
    }
    res->child->next = nullptr; // this line will get rid of that error
    return dummyNode->child;
    }
    Node* flattenLinkedList(Node* head)
    {
    if(head == NULL || head->next == NULL) {
    return head;
    }
    Node* mergedHead = flattenLinkedList(head->next);
    head = merge(head, mergedHead);
    return head;
    }

  • @aviraliitianornitian9937
    @aviraliitianornitian9937 4 місяці тому +3

    striver i think we dont need the linr in this question "if(dumynode)dumynode->child->next=null;"
    because it already covered in the loop the code will work without this line.

    • @ayushaggarwal906
      @ayushaggarwal906 3 місяці тому

      that line is better if we use iteration. Like this
      Node* flat(Node* first, Node* second, Node* third){
      Node* dummy= new Node(-1);
      Node* mover=dummy;
      Node* temp1=first;
      Node* temp2=second;
      while(temp1!=NULL && temp2!=NULL){
      if(temp1->datadata){
      mover->child=temp1;
      mover=temp1;
      temp1=temp1->child;
      }
      else{
      mover->child=temp2;
      mover=temp2;
      temp2=temp2->child;
      }
      }
      if(temp1!=NULL){
      mover->child=temp1;
      }
      else{
      mover->child=temp2;
      }
      dummy->child->next=third; // Using this line
      return dummy->child;
      }
      Node* flattenLinkedList(Node* head)
      {
      Node* temp=head;
      if(temp->next==NULL) return temp;
      while (temp->next != NULL) {
      temp=flat(temp, temp->next, temp->next->next);
      }
      return temp;
      }

  • @romanempire1085
    @romanempire1085 6 місяців тому +6

    words by legend - "lets go deep !!" 😂😂😂😂

    • @kanta4402
      @kanta4402 2 місяці тому

      😂😂😂😂

  • @vaibhavsingh288
    @vaibhavsingh288 5 місяців тому +1

    Test cases
    29/30
    Your time complexity: O(n^2logn)
    We think Common causes of Time Limit Exceeded :
    Your time complexity: O(n^2logn)

  • @vinay73307
    @vinay73307 8 місяців тому +5

    for this Question , we can use the merge k sorted lists approach using min heap , it is very easy

    • @biovolt222
      @biovolt222 3 місяці тому

      Can you share the solution if possible?

    • @mansipatel3481
      @mansipatel3481 3 місяці тому

      @@biovolt222
      Node flatten(Node root) {
      // Your code here
      PriorityQueue pq = new PriorityQueue((a,b)->a.data-b.data);
      Node temp=root;
      while(temp!=null){
      pq.offer(temp);
      temp=temp.next;
      }
      Node dummy=new Node(-1);
      temp=dummy;
      while(!pq.isEmpty()){
      Node node = pq.poll();
      if(node.bottom!=null){
      pq.offer(node.bottom);
      }
      temp.bottom=node;
      temp=temp.bottom;
      }
      return dummy.bottom;
      }

  • @SarvanSuthar-d1p
    @SarvanSuthar-d1p Місяць тому +1

    I think in brute force approach time complexity should be O(m*n*log(m*n))

  • @piyushkumar2900
    @piyushkumar2900 2 місяці тому +1

    Can we use a priority queue to store the pointers and then pick the minimum one and iterate it with the second minium in the queue, NMlog(N) maybe?

  • @hetvikasari7828
    @hetvikasari7828 4 місяці тому +1

    please tell me why this code is not passing 1 test case out of 30 -
    /* Node(int data, Node next, Node child)
    {
    this.data = data;
    this.next = next;
    this.child = child;
    }
    }*/
    public class Solution {
    public static Node merging(Node list1 , Node list2){
    Node dommy = new Node(0) , result = dommy;
    while ( list1 != null && list2 != null ){
    if(list1.data < list2.data){
    result.child = list1;
    result = list1;
    list1 = list1.child;
    }else {
    result.child = list2;
    result = list2;
    list2 = list2.child;
    }
    result.next = null;
    }
    if(list1 != null ) result.child = list1;
    else result.child = list2;
    if (dommy.child != null) {
    dommy.child.next = null;
    }
    return dommy.child;
    }
    public static Node flattenLinkedList(Node head) {
    if(head == null || head.next == null ) return head;
    Node merged_head = flattenLinkedList(head.next);

    return merging( head , merged_head);
    }
    }

  • @shantanugupta-oz1dx
    @shantanugupta-oz1dx 3 місяці тому +1

    You are a god. So much stress I have while solving problems. But If I search for the problem and I find TUF has solved it. I know that no matter what by the end of the video I'll understand it in full depth. Thank you so much

  • @titusandronikus1337
    @titusandronikus1337 6 місяців тому +1

    the final time complexity is incorrect, it’s actually quadratic. But there’s a way to make it linearithmic: you need to merge lists in pairs and then results of those pairs and so on

  • @BharathKumarEnishetty
    @BharathKumarEnishetty 10 днів тому

    Superrb Lecture,Vey initituive to understand recursive execution contexts, 👌👌👌👌👌👌👌👌👌👌

  • @rahulnegi4027
    @rahulnegi4027 15 днів тому

    @takeUforward wanted to point out the worst time complexity would be O(n*mlog(n*m)) as we are mergin at each step and at worse they both can be of same length please do correct me if i am wrong see yah

  • @Satvik__Jain
    @Satvik__Jain 3 місяці тому

    O(NlogN)
    Node *flatten(Node *root) {
    // Your code here
    multimap mpp;
    Node* temp = root, *bot = root;
    while(temp){
    while(bot){
    mpp.insert({bot->data, bot});
    bot = bot->bottom;
    }
    temp = temp -> next;
    bot = temp;
    }
    auto it = mpp.begin();
    auto nxt = mpp.begin();
    while(it != mpp.end()){
    // nxt++;
    // (it->second)->next = nxt->second;
    // it++;
    cout first

  • @mansipatel3481
    @mansipatel3481 3 місяці тому

    Java Solution using PriorityQueue (similar to merge k sorted list):
    Node flatten(Node root) {
    // Your code here
    PriorityQueue pq = new PriorityQueue((a,b)->a.data-b.data);
    Node temp=root;
    while(temp!=null){
    pq.offer(temp);
    temp=temp.next;
    }
    Node dummy=new Node(-1);
    temp=dummy;
    while(!pq.isEmpty()){
    Node node = pq.poll();
    if(node.bottom!=null){
    pq.offer(node.bottom);
    }
    temp.bottom=node;
    temp=temp.bottom;
    }
    return dummy.bottom;
    }

  • @dhruvkhanna2410
    @dhruvkhanna2410 3 місяці тому

    Optimized code is working for only 2 test cases out of 15........

  • @stith_pragya
    @stith_pragya 6 місяців тому +1

    #Understood.........Thank You So Much for this wonderful video.....🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻🙏🏻

  • @sourjadhar9332
    @sourjadhar9332 6 місяців тому +1

    Seeing this explanation i can hence confirm that u r the Recursion GOD man!

  • @kittupromax
    @kittupromax 9 місяців тому +1

    Sir, can we solve this question using priority queue?
    Like we did in merging K linked list .
    here is my solution of the question using linked list but the solution is not getting accepted on coding ninjas
    struct mycomp {
    bool operator()(Node* a, Node* b){
    return a->data > b->data;
    }
    };

    Node* flattenLinkedList(Node* root){
    priority_queue p;
    while (root != NULL) {
    p.push(root);
    root = root->next;
    }
    Node* dummy=new Node(-1);
    Node* temp=dummy;
    while (!p.empty()) {
    auto k = p.top();
    p.pop();
    temp->child=k;
    temp=temp->child;
    if (k->child)
    p.push(k->child);
    }
    return dummy->child;
    }

    • @AS-gf3ci
      @AS-gf3ci 8 місяців тому

      @kittupromax very good observation!! This approach should work just fine and TC & SC won't vary much using a min heap. So this could well be an accepted approach for this problem.

  • @abdulrehmanamer4252
    @abdulrehmanamer4252 Місяць тому

    You can avoid recursion stack space O(n) by making an iterative solution
    The overall time complexity would be O(n*m)
    and the space complexity would be O(1)
    Here is my code:
    class Solution:
    def flatten(self, root):
    #Your code here
    res = Node(float('-inf'))
    while root:
    res = self.merge2Lists(root, res)
    root = root.next
    return res.bottom


    def merge2Lists(self, l1, l2):
    temp = Node(-1)
    res = temp
    while l1 and l2:
    if l1.data

  • @teqwonnorman4928
    @teqwonnorman4928 3 дні тому

    So can it be flattened vertically or horizontally?

  • @divyansh_19
    @divyansh_19 7 місяців тому +2

    go deep!! go deep!!

  • @vedantnaikwadi5394
    @vedantnaikwadi5394 3 місяці тому

    bro please complete stack heap and string playlist plz

  • @ishanmoykhede9484
    @ishanmoykhede9484 3 місяці тому

    woohoo i code the optimal version just by getting intutition

  • @anirudhm187
    @anirudhm187 2 місяці тому

    In recursion approach the space complexity we took was O(N) as recursion stack but will we not consider the N dummyNodes we created while we merged 2 lists? We could have deleted / freed them before we return from function, otherwise our SC is O(2N).

  • @shubhamjain54519
    @shubhamjain54519 8 місяців тому +2

    12:39 better approach

  • @mohammedharoon1167
    @mohammedharoon1167 2 місяці тому +1

    You make the hard questions looks so easy 👽

  • @hertzbit
    @hertzbit 4 місяці тому

    Recursive Solution is partially accepted on Coding Ninjas platform. 29/30.
    Solution with Extra Space i.e. List is accepted 30/30.
    Any optimisation required in recursive solution ?

  • @parthverma2436
    @parthverma2436 5 місяців тому

    Iteratively this can also be solved using a Priority Queue (equivalent to recursion stack space) + merging K sorted LLs.

  • @justsomeguywithoutamustach9978
    @justsomeguywithoutamustach9978 3 місяці тому

    really great question, I did it with minHeap first. Your solution is really intriguing. There is no need for recursion though, we can iteratively merge from the head of our original linkedlist as well. Just keep a pointer for the next upcoming linkedlist in a variable called front.

  • @piyushmahale9024
    @piyushmahale9024 2 місяці тому +1

    ❤❤❤❤

  • @YeaOhYeahh
    @YeaOhYeahh 8 місяців тому

    using priority queue, (approach explained in next video)
    ```
    Node* flattenLinkedList(Node* head)
    {
    if(!head) return NULL;
    priority_queue pq;

    Node* dummy = new Node(-1);
    Node* temp = head;
    while(temp != NULL) {
    pq.push({temp -> data, temp});
    temp = temp -> next;
    }
    temp = dummy;
    while(pq.size()) {
    auto it = pq.top();
    pq.pop();
    if(it.second -> child)
    pq.push({it.second -> child -> data, it.second -> child});
    temp -> child = it.second;
    temp = it.second;
    temp -> next = NULL;
    }
    return dummy -> child;
    }
    ```

  • @KushagraShukla-z6u
    @KushagraShukla-z6u Місяць тому

    why we can't merge it from front ? please tell

  • @dayashankarlakhotia4943
    @dayashankarlakhotia4943 9 місяців тому

    Node flatten(Node head){
    if(head==null||head.next==null)
    return head;
    head.next =flatten(head.next);
    return merge(head,head.next);
    }
    Node merge(Node cur1,Node cur2){
    if(cur1==null) return cur2;
    if(cur2==null) return cur1;
    Node ans=null;
    if(cur1.data

  • @Roshanhoro123
    @Roshanhoro123 2 місяці тому

    Best explanation with recursion example.. You explained very well of each step of recursion.How a value is returned when recursion is called. Thanks!!☺

  • @AdityaKumar-be7hx
    @AdityaKumar-be7hx 3 місяці тому

    I think the TC is just O(#nodes). We are actually just touching each node just a few time

  • @harshitjaiswal9439
    @harshitjaiswal9439 8 місяців тому +1

    understood. amazing explanation.

  • @juturtaur298
    @juturtaur298 Місяць тому

    Thank you striver I really needed that recursion logic building

  • @hitmanop4078
    @hitmanop4078 21 день тому

    brute: 00:00
    optimal: 12:38

  • @MJBZG
    @MJBZG 2 місяці тому +1

    v good question

  • @RajeevCanDev
    @RajeevCanDev 8 місяців тому +1

    you really takes us forward!

  • @ravipatel-xu5qi
    @ravipatel-xu5qi 5 місяців тому

    why can't we use priority queue concept to merge multiple sorted linked list concept. Here all vertical list are sorted. Simply add head of each vertical list in priority queue and then process their respective child node.

    • @chiraggill2940
      @chiraggill2940 3 місяці тому

      try to code /dry run it once you will get your answer

  • @DeadPoolx1712
    @DeadPoolx1712 13 днів тому

    UNDERSTOOD;

  • @saimurali9648
    @saimurali9648 4 місяці тому

    at 7:06 😂😂😂

  • @Ayeshasingh720
    @Ayeshasingh720 Місяць тому

    understood

  • @kaushalpadaliya529
    @kaushalpadaliya529 3 місяці тому

    understood

  • @ayushindapure6903
    @ayushindapure6903 5 місяців тому

    7:04 I didn't catch that as well🤣

  • @Sahilsharma-sk5vr
    @Sahilsharma-sk5vr 2 місяці тому

    wow. wow

  • @dilpreetsingh881
    @dilpreetsingh881 4 місяці тому

    Great explanation and illustration !!!

  • @AkOp-bf9vm
    @AkOp-bf9vm Місяць тому

    ITERATIVE WAY
    class Solution {
    public:
    // Function which returns the root of the flattened linked list.
    Node* merger(Node*h1,Node*h2){
    if(h1==NULL) return h2;
    if(h2==NULL) return h1;
    Node* dummy= new Node(-1);
    Node* mover=dummy;
    while(h1 && h2){
    if(h1->datadata){
    mover->bottom=h1;
    mover=h1;
    h1=h1->bottom;
    }
    else{
    mover->bottom=h2;
    mover=h2;
    h2=h2->bottom;
    }
    }
    if(h1){
    mover->bottom=h1;
    }
    if(h2){
    mover->bottom=h2;
    }
    return dummy->bottom;
    }
    Node *flatten(Node *root) {
    // Your code here
    if(root==NULL || root->next==NULL) return root;
    Node*head1=root;
    Node*curr=NULL;
    while(head1){
    curr=merger(head1,curr);
    head1=head1->next;
    }
    return curr;
    }
    };

  • @NazeerBashaShaik
    @NazeerBashaShaik 5 місяців тому

    Understood, thank you.

  • @franciskp9117
    @franciskp9117 8 місяців тому +1

    Hey guys....I've got a better approach. It's running on VSCODE, but not working on Coding Ninjas platform. "
    Node* flattenLinkedList(Node* head)
    {
    Node* temp = head;
    while(temp->next != NULL){
    Node* top = temp->next;
    temp->next = temp->child;
    while(temp->child != nullptr){
    temp = temp->next;
    temp->next = temp->child;
    }
    temp->next = top;
    temp = top;

    }
    temp->next = nullptr;

    return head;
    }"

    • @vishious14
      @vishious14 7 місяців тому

      The nodes are supposed to be connected as child and not next. There is an explanation at the end of problem statement.

  • @banothutharun2743
    @banothutharun2743 7 місяців тому

    topic explation is a like a woww😃

  • @surbhigupta5777
    @surbhigupta5777 3 місяці тому

    Understood:)

  • @abhishekprasad010
    @abhishekprasad010 3 місяці тому

    Understood!

  • @Lucy92735
    @Lucy92735 4 місяці тому

    Understood 🎉

  • @dewanandkumar8589
    @dewanandkumar8589 4 місяці тому

    Understood

  • @hardikpatel352
    @hardikpatel352 4 місяці тому

    understood

  • @AkashKumarTiwary-u4b
    @AkashKumarTiwary-u4b 4 місяці тому

    god

  • @cenacr007
    @cenacr007 4 місяці тому

    us

  • @rahulhembram4519
    @rahulhembram4519 7 місяців тому

    UnderStood

  • @YourCodeVerse
    @YourCodeVerse 7 місяців тому

    Understood✅🔥🔥

  • @Learnprogramming-q7f
    @Learnprogramming-q7f 7 місяців тому

    Thank you Bhaiya

  • @NARUTOUZUMAKI-bk4nx
    @NARUTOUZUMAKI-bk4nx 8 місяців тому

    Understoood

  • @iamnoob7593
    @iamnoob7593 6 місяців тому

    Brillant

  • @anastasiiamaslova4220
    @anastasiiamaslova4220 8 місяців тому

    great explanation!

  • @lakhansingh_barod
    @lakhansingh_barod 9 місяців тому

    Understood

  • @abhijeetbasfore6816
    @abhijeetbasfore6816 8 місяців тому

    Awesome.

  • @subee128
    @subee128 9 місяців тому

    Thanks

  • @shreyxnsh.14
    @shreyxnsh.14 7 місяців тому

    Bruteforce code:
    Node* flattenLinkedList(Node* head)
    {
    // Write your code here
    Node* temp = head;
    vector vec;
    while(temp){
    Node* child = temp;
    while(child){
    vec.push_back(child->data);
    child=child->child;
    }
    temp=temp->next;
    }
    if(vec.size()==0)
    return NULL;
    sort(vec.begin(), vec.end());
    Node* newhead = new Node(vec[0]);
    Node* mover = newhead;

    for(int i=1;ichild = temp;
    mover=mover->child;
    }
    return newhead;
    }

  • @ajml_hnter
    @ajml_hnter 6 місяців тому

    Easy Approach in C++
    Space Complexity: O(1)
    Time Complexity: O(n*2m)
    Node* mergeLists(Node* root1, Node* root2){
    Node* dummy = new Node(0);
    Node* head = dummy;
    while(root1 && root2){
    if(root1->data < root2->data){
    head->child = root1;
    root1 = root1->child;
    }else{
    head->child = root2;
    root2 = root2->child;
    }
    head = head->child;
    }
    if(root1) head->child = root1;
    if(root2) head->child = root2;
    return dummy->child;
    }
    Node* flattenLinkedList(Node* head){
    Node* prev = NULL;
    while(head){
    prev = mergeLists(prev, head);
    head = head->next;
    }
    return prev;
    }