合并有序链表
最近被问到了这个题,要求不能用额外空间,这个题的思路比较简单,由于是有序的就做一个遍历就可以,当时时间比较急写的解法代码行数较多不够简洁,再次记录一个简介的版本
用规约的话其实很容易实现,代码简洁,但是链表长度太长规约就会崩溃,再次只放递归的版本,自己面试的时候写的垃圾代码就不放了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
   | struct Node{     int val;     Node *next;     Node(int _v):val(_v),next(NULL){} };
  Node* mergeList(Node *l1,Node *l2){     if(!l1) return l2;     else if(!l2) return l1;
      Node* head = new Node(-1);     Node* p = head;     while(l1&&l2){         if(l1->val<l2->val){             p->next=l1;             l1=l1->next;         }else{             p->next=l2;             l2=l2->next;         }         p=p->next;     }     if(l1) p->next=l1;     else if(l2) p->next=l2;
      return head->next;
  }
  | 
 
自己写的复杂版本没有用到哨兵结点,导致需要分情况讨论,平白无故多了代码行数,添加哨兵后代码立马简洁很多,
不仅这道题,在众多链表题中哨兵结点都有着妙用,可以极大地减少边界条件的判断和代码的编写。