描述
将两个排序链表合并为一个新的排序链表
样例
给出 1->3->8->11->15->null,2->null, 返回 1->2->3->8->11->15->null
思考
- 因为之前没有做过这种题目,所以一开始只设置了一个指针来对两个列表中的最小值进行插入,发现总是跑到 7% 的时候就出错,应该只有空集通过了测试数据。
- 实际上随着链表元素的插入,指针也在向后移,而函数需要的是整个链表的指针,而不是随着元素插入指向最后一个元素的指针
- 所以需要设置两个指针,一个执行插入操作,一个指向头结点
- 提一句,VS 的断点还是很有用的,不然得折腾我几个小时了
代码
// By Lentitude
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param ListNode l1 is the head of the linked list
* @param ListNode l2 is the head of the linked list
* @return: ListNode head of linked list
*/
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
// write your code here
if(l1 == NULL) return l2; //如果有一个是空表
if(l2 == NULL) return l1;
ListNode *l3 = NULL, *p = NULL;
while(l1 != NULL && l2 != NULL){
if(l1->val < l2->val){
if(l3==NULL){
l3 = new ListNode(l1->val);
// 很重要, 因为需要返回一个链表的指针
p = l3;
} else {
l3->next = new ListNode(l1->val);
l3 = l3->next;
}
l1 = l1->next;
} else {
if(l3==NULL){
l3 = new ListNode(l2->val);
p=l3;
} else {
l3->next = new ListNode(l2->val);
l3 = l3->next;
}
l2 = l2->next;
}
}
if(l1 != NULL) l3->next = l1;
if(l2 != NULL) l3->next = l2;
return p;
}
};