合并有序链表

最近被问到了这个题,要求不能用额外空间,这个题的思路比较简单,由于是有序的就做一个遍历就可以,当时时间比较急写的解法代码行数较多不够简洁,再次记录一个简介的版本

用规约的话其实很容易实现,代码简洁,但是链表长度太长规约就会崩溃,再次只放递归的版本,自己面试的时候写的垃圾代码就不放了

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;

}

自己写的复杂版本没有用到哨兵结点,导致需要分情况讨论,平白无故多了代码行数,添加哨兵后代码立马简洁很多,
不仅这道题,在众多链表题中哨兵结点都有着妙用,可以极大地减少边界条件的判断和代码的编写。